* (bug 28586) YAML: strings that are the same as boolean literals
authorSam Reed <reedy@users.mediawiki.org>
Mon, 18 Apr 2011 11:42:44 +0000 (11:42 +0000)
committerSam Reed <reedy@users.mediawiki.org>
Mon, 18 Apr 2011 11:42:44 +0000 (11:42 +0000)
* (bug 28591) Update/replace/supplement spyc (YAML parsing library)
* YAML API output is now 1.2 compliant, using JSON as the formatter

YAML 1.2 spec is a JSON subset - "The primary objective of this revision is to bring YAML into compliance with JSON as an official subset. YAML 1.2 is compatible with 1.1 for most practical applications - this is a minor revision." [1] Per discussion with Tim, switch YAML to use the JSON formatter

Was originally going to delete the ApiFormatYaml per Tim, but class needed to keep nicer (and apparent) output in API help page

Hence made subclass ApiFormatJson, minimal method overriding

spyc.php deleted from libs

[1] http://www.yaml.org/spec/1.2/spec.html#id2803629

RELEASE-NOTES
includes/GlobalFunctions.php
includes/MessageCache.php
includes/OutputPage.php
includes/api/ApiFormatYaml.php
includes/libs/spyc.php [deleted file]

index e6cf2ed..9ce359f 100644 (file)
@@ -67,6 +67,7 @@ PHP if you have not done so prior to upgrading MediaWiki.
   require_once "$IP/extensions/Math/Math.php";
 * $wgProfiler is now a configuration array, see StartProfiler.sample for details
 * $wgProfiling has been removed
+* The spyc library is now no longer included in phase3
 
 === New features in 1.18 ===
 * (bug 8130) Query pages should limit to content namespaces, not just main
@@ -336,6 +337,9 @@ PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 27712) add parent_id to list=deletedrevs
 * (bug 28455) Add 'toponly' to recentchanges API module
 * (bug 26873) API: Add 'toponly' filter in usercontribs module
+* (bug 28586) YAML: strings that are the same as boolean literals
+* (bug 28591) Update/replace/supplement spyc (YAML parsing library)
+* YAML API output is now 1.2 compliant, using JSON as the formatter
 
 === Languages updated in 1.18 ===
 
index 0c88816..2f83b07 100644 (file)
@@ -716,10 +716,12 @@ function wfMsgHtml( $key ) {
  * @return string
  */
 function wfMsgWikiHtml( $key ) {
-       global $wgOut;
+       global $wgMessageCache;
        $args = func_get_args();
        array_shift( $args );
-       return wfMsgReplaceArgs( $wgOut->parse( wfMsgGetKey( $key, true ), /* can't be set to false */ true ), $args );
+       return wfMsgReplaceArgs(
+               $wgMessageCache->parse( wfMsgGetKey( $key, true ), null, /* can't be set to false */ true ),
+               $args );
 }
 
 /**
@@ -741,7 +743,7 @@ function wfMsgWikiHtml( $key ) {
  * Behavior for conflicting options (e.g., parse+parseinline) is undefined.
  */
 function wfMsgExt( $key, $options ) {
-       global $wgOut;
+       global $wgMessageCache;
 
        $args = func_get_args();
        array_shift( $args );
@@ -781,9 +783,9 @@ function wfMsgExt( $key, $options ) {
        }
 
        if( in_array( 'parse', $options, true ) ) {
-               $string = $wgOut->parse( $string, true, !$forContent, $langCodeObj );
+               $string = $wgMessageCache->parse( $string, null, true, !$forContent, $langCodeObj );
        } elseif ( in_array( 'parseinline', $options, true ) ) {
-               $string = $wgOut->parse( $string, true, !$forContent, $langCodeObj );
+               $string = $wgMessageCache->parse( $string, null, true, !$forContent, $langCodeObj );
                $m = array();
                if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
                        $string = $m[1];
index d907a78..c5d6ac0 100644 (file)
@@ -102,6 +102,8 @@ class MessageCache {
 
        /**
         * ParserOptions is lazy initialised.
+        *
+        * @return ParserOptions
         */
        function getParserOptions() {
                if ( !$this->mParserOptions ) {
@@ -220,6 +222,8 @@ class MessageCache {
 
        /**
         * Set the cache to $cache, if it is valid. Otherwise set the cache to false.
+        *
+        * @return bool
         */
        function setCache( $cache, $code ) {
                if ( isset( $cache['VERSION'] ) && $cache['VERSION'] == MSG_CACHE_VERSION ) {
@@ -734,6 +738,21 @@ class MessageCache {
                        return $message;
                }
 
+               $parser = $this->getParser();
+               if ( $parser ) {
+                       $popts = $this->getParserOptions();
+                       $popts->setInterfaceMessage( $interface );
+                       $popts->setTargetLanguage( $language );
+                       $popts->setUserLang( $language );
+                       $message = $parser->transformMsg( $message, $popts, $title );
+               }
+               return $message;
+       }
+
+       /**
+        * @return Parser
+        */
+       function getParser() {
                global $wgParser, $wgParserConf;
                if ( !$this->mParser && isset( $wgParser ) ) {
                        # Do some initialisation so that we don't have to do it twice
@@ -746,16 +765,28 @@ class MessageCache {
                        } else {
                                $this->mParser = clone $wgParser;
                        }
-                       #wfDebug( __METHOD__ . ": following contents triggered transform: $message\n" );
                }
-               if ( $this->mParser ) {
-                       $popts = $this->getParserOptions();
-                       $popts->setInterfaceMessage( $interface );
+               return $this->mParser;
+       }
+
+       /**
+        * @param $text string
+        * @param $title
+        * @param $linestart bool
+        * @return ParserOutput
+        */
+       public function parse( $text, $title = null, $linestart = true, $interface = false, $language = null  ) {
+               $parser = $this->getParser();
+               $popts = $this->getParserOptions();
+
+               if ( $interface ) {
+                       $popts->setInterfaceMessage( true );
+               }
+               if ( $language !== null ) {
                        $popts->setTargetLanguage( $language );
-                       $popts->setUserLang( $language );
-                       $message = $this->mParser->transformMsg( $message, $popts, $title );
                }
-               return $message;
+
+               return $parser->parse( $text, $title, $popts, $linestart );
        }
 
        function disable() {
index 120d55a..67a634d 100644 (file)
@@ -792,7 +792,7 @@ class OutputPage {
         * @param $t Title object
         */
        public function setTitle( $t ) {
-               $this->getContext()->setTitle($t);
+               $this->getContext()->setTitle( $t );
        }
 
        /**
index 58153fa..ecf3590 100644 (file)
@@ -33,20 +33,12 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  * API YAML output formatter
  * @ingroup API
  */
-class ApiFormatYaml extends ApiFormatBase {
-
-       public function __construct( $main, $format ) {
-               parent::__construct( $main, $format );
-       }
+class ApiFormatYaml extends ApiFormatJson {
 
        public function getMimeType() {
                return 'application/yaml';
        }
 
-       public function execute() {
-               $this->printText( Spyc::YAMLDump( $this->getResultData() ) );
-       }
-
        public function getDescription() {
                return 'Output data in YAML format' . parent::getDescription();
        }
diff --git a/includes/libs/spyc.php b/includes/libs/spyc.php
deleted file mode 100644 (file)
index cc6993c..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-<?php
-/**
- * Spyc -- A Simple PHP YAML Class
- *
- * @file
- * @version 0.2.3 -- 2006-02-04
- * @author Chris Wanstrath <chris@ozmm.org>
- * @see http://spyc.sourceforge.net/
- * @copyright Copyright 2005-2006 Chris Wanstrath
- * @license http://www.opensource.org/licenses/mit-license.php MIT License
- */
-
-/**
- * The Simple PHP YAML Class.
- *
- * This class can be used to read a YAML file and convert its contents
- * into a PHP array.  It currently supports a very limited subsection of
- * the YAML spec.
- *
- * @ingroup API
- */
-class Spyc {
-
-       /**
-        * Dump YAML from PHP array statically
-        *
-        * The dump method, when supplied with an array, will do its best
-        * to convert the array into friendly YAML.  Pretty simple.  Feel free to
-        * save the returned string as nothing.yml and pass it around.
-        *
-        * Oh, and you can decide how big the indent is and what the wordwrap
-        * for folding is.  Pretty cool -- just pass in 'false' for either if
-        * you want to use the default.
-        *
-        * Indent's default is 2 spaces, wordwrap's default is 40 characters.  And
-        * you can turn off wordwrap by passing in 0.
-        *
-        * @param $array Array: PHP array
-        * @param $indent Integer: Pass in false to use the default, which is 2
-        * @param $wordwrap Integer: Pass in 0 for no wordwrap, false for default (40)
-        * @return String
-        */
-       public static function YAMLDump( $array, $indent = false, $wordwrap = false ) {
-               $spyc = new Spyc;
-               return $spyc->dump( $array, $indent, $wordwrap );
-       }
-
-       /**
-        * Dump PHP array to YAML
-        *
-        * The dump method, when supplied with an array, will do its best
-        * to convert the array into friendly YAML.  Pretty simple.  Feel free to
-        * save the returned string as tasteful.yml and pass it around.
-        *
-        * Oh, and you can decide how big the indent is and what the wordwrap
-        * for folding is.  Pretty cool -- just pass in 'false' for either if
-        * you want to use the default.
-        *
-        * Indent's default is 2 spaces, wordwrap's default is 40 characters.  And
-        * you can turn off wordwrap by passing in 0.
-        *
-        * @param $array Array: PHP array
-        * @param $indent Integer: Pass in false to use the default, which is 2
-        * @param $wordwrap Integer: Pass in 0 for no wordwrap, false for default (40)
-        * @return String
-        */
-       public function dump( $array, $indent = false, $wordwrap = false ) {
-               // Dumps to some very clean YAML.  We'll have to add some more features
-               // and options soon.  And better support for folding.
-
-               // New features and options.
-               if ( $indent === false or !is_numeric( $indent ) ) {
-                       $this->_dumpIndent = 2;
-               } else {
-                       $this->_dumpIndent = $indent;
-               }
-
-               if ( $wordwrap === false or !is_numeric( $wordwrap ) ) {
-                       $this->_dumpWordWrap = 40;
-               } else {
-                       $this->_dumpWordWrap = $wordwrap;
-               }
-
-               // New YAML document
-               $string = "---\n";
-
-               // Start at the base of the array and move through it.
-               foreach ( $array as $key => $value ) {
-                       $string .= $this->_yamlize( $key, $value, 0 );
-               }
-               return $string;
-       }
-
-       /**** Private Properties ****/
-
-       /**
-        * Unused variables, but just commented rather than deleting
-        * to save altering the library
-       private $_haveRefs;
-       private $_allNodes;
-       private $_lastIndent;
-       private $_lastNode;
-       private $_inBlock;
-       private $_isInline;
-       **/
-       private $_dumpIndent;
-       private $_dumpWordWrap;
-
-       /**** Private Methods ****/
-
-       /**
-        * Attempts to convert a key / value array item to YAML
-        *
-        * @param $key Mixed: the name of the key
-        * @param $value Mixed: the value of the item
-        * @param $indent Integer: the indent of the current node
-        * @return String
-        */
-       private function _yamlize( $key, $value, $indent ) {
-               if ( is_array( $value ) ) {
-                       // It has children.  What to do?
-                       // Make it the right kind of item
-                       $string = $this->_dumpNode( $key, null, $indent );
-                       // Add the indent
-                       $indent += $this->_dumpIndent;
-                       // Yamlize the array
-                       $string .= $this->_yamlizeArray( $value, $indent );
-               } else {
-                       // It doesn't have children.  Yip.
-                       $string = $this->_dumpNode( $key, $value, $indent );
-               }
-               return $string;
-       }
-
-       /**
-        * Attempts to convert an array to YAML
-        *
-        * @param $array Array: the array you want to convert
-        * @param $indent Integer: the indent of the current level
-        * @return String
-        */
-       private function _yamlizeArray( $array, $indent ) {
-               if ( is_array( $array ) ) {
-                       $string = '';
-                       foreach ( $array as $key => $value ) {
-                               $string .= $this->_yamlize( $key, $value, $indent );
-                       }
-                       return $string;
-               } else {
-                       return false;
-               }
-    }
-
-       /**
-        * Find out whether a string needs to be output as a literal rather than in plain style.
-        * Added by Roan Kattouw 13-03-2008
-        *
-        * @param $value String: the string to check
-        * @return Boolean
-        */
-       function _needLiteral( $value ) {
-               // Check whether the string contains # or : or begins with any of:
-               // [ - ? , [ ] { } ! * & | > ' " % @ ` ]
-               // or is a number or contains newlines
-               return (bool)( gettype( $value ) == "string" &&
-                       ( is_numeric( $value )  ||
-                       strpos( $value, "\n" ) ||
-                       preg_match( "/[#:]/", $value ) ||
-                       preg_match( "/^[-?,[\]{}!*&|>'\"%@`]/", $value ) ) );
-       }
-
-       /**
-        * Returns YAML from a key and a value
-        *
-        * @param $key Mixed: the name of the key
-        * @param $value Mixed: the value of the item
-        * @param $indent Integer: the indent of the current node
-        * @return String
-        */
-       private function _dumpNode( $key, $value, $indent ) {
-               // do some folding here, for blocks
-               if ( $this->_needLiteral( $value ) ) {
-                       $value = $this->_doLiteralBlock( $value, $indent );
-               } else {
-                       $value = $this->_doFolding( $value, $indent );
-               }
-
-               $spaces = str_repeat( ' ', $indent );
-
-               if ( is_int( $key ) ) {
-                       // It's a sequence
-                       if ( $value !== '' && !is_null( $value ) )
-                               $string = $spaces . '- ' . $value . "\n";
-                       else
-                               $string = $spaces . "-\n";
-               } else {
-                        if ( $key == '*' ) // bug 21922 - Quote asterix used as keys
-                               $key = "'*'";
-
-                       // It's mapped
-                       if ( $value !== '' && !is_null( $value ) )
-                               $string = $spaces . $key . ': ' . $value . "\n";
-                       else
-                               $string = $spaces . $key . ":\n";
-               }
-               return $string;
-       }
-
-       /**
-        * Creates a literal block for dumping
-        *
-        * @param $value String
-        * @param $indent Integer: the value of the indent
-        * @return String
-        */
-       private function _doLiteralBlock( $value, $indent ) {
-               $exploded = explode( "\n", $value );
-               $newValue = '|-';
-               $indent  += $this->_dumpIndent;
-               $spaces   = str_repeat( ' ', $indent );
-               foreach ( $exploded as $line ) {
-                       $newValue .= "\n" . $spaces . trim( $line );
-               }
-               return $newValue;
-       }
-
-       /**
-        * Folds a string of text, if necessary
-        *
-        * @param $value String: the string you wish to fold
-        * @param $indent Integer: the indent of the current node
-        * @return String
-        */
-       private function _doFolding( $value, $indent ) {
-               // Don't do anything if wordwrap is set to 0
-               if ( $this->_dumpWordWrap === 0 ) {
-                       return $value;
-               }
-
-               if ( strlen( $value ) > $this->_dumpWordWrap ) {
-                       $indent += $this->_dumpIndent;
-                       $indent = str_repeat( ' ', $indent );
-                       $wrapped = wordwrap( $value, $this->_dumpWordWrap, "\n$indent" );
-                       $value   = ">-\n" . $indent . $wrapped;
-               }
-               return $value;
-       }
-}