Make thumbsize option go through ParserOptions.
[lhc/web/wiklou.git] / includes / parser / Parser.php
index fc9303c..29775c6 100644 (file)
@@ -369,7 +369,7 @@ class Parser {
 
                $text = Sanitizer::normalizeCharReferences( $text );
 
-               if ( ( $wgUseTidy && $this->mOptions->mTidy ) || $wgAlwaysUseTidy ) {
+               if ( ( $wgUseTidy && $this->mOptions->getTidy() ) || $wgAlwaysUseTidy ) {
                        $text = MWTidy::tidy( $text );
                } else {
                        # attempt to sanitize at least some nesting problems
@@ -411,7 +411,7 @@ class Parser {
                        $PFreport = "Expensive parser function count: {$this->mExpensiveFunctionCount}/$wgExpensiveParserFunctionLimit\n";
                        $limitReport =
                                "NewPP limit report\n" .
-                               "Preprocessor node count: {$this->mPPNodeCount}/{$this->mOptions->mMaxPPNodeCount}\n" .
+                               "Preprocessor node count: {$this->mPPNodeCount}/{$this->mOptions->getMaxPPNodeCount()}\n" .
                                "Post-expand include size: {$this->mIncludeSizes['post-expand']}/$max bytes\n" .
                                "Template argument size: {$this->mIncludeSizes['arg']}/$max bytes\n".
                                $PFreport;
@@ -491,7 +491,7 @@ class Parser {
         * @private
         * @static
         */
-       function getRandomString() {
+       static function getRandomString() {
                return dechex( mt_rand( 0, 0x7fffffff ) ) . dechex( mt_rand( 0, 0x7fffffff ) );
        }
 
@@ -945,7 +945,7 @@ class Parser {
                                        $last_tag = array_pop( $last_tag_history );
 
                                        if ( array_pop( $td_history ) ) {
-                                               $previous = "</{$last_tag}>{$previous}";
+                                               $previous = "</{$last_tag}>\n{$previous}";
                                        }
 
                                        if ( $first_character === '|' ) {
@@ -1072,8 +1072,8 @@ class Parser {
                        $df = DateFormatter::getInstance();
                        $text = $df->reformat( $this->mOptions->getDateFormat(), $text );
                }
-               $text = $this->doAllQuotes( $text );
                $text = $this->replaceInternalLinks( $text );
+               $text = $this->doAllQuotes( $text );
                $text = $this->replaceExternalLinks( $text );
 
                # replaceInternalLinks may sometimes leave behind
@@ -1841,6 +1841,11 @@ class Parser {
                        $wasblank = ( $text  == '' );
                        if ( $wasblank ) {
                                $text = $link;
+                       } else {
+                               # Bug 4598 madness. Handle the quotes only if they come from the alternate part
+                               # [[Lista d''e paise d''o munno]] -> <a href="">Lista d''e paise d''o munno</a>
+                               # [[Criticism of Harry Potter|Criticism of ''Harry Potter'']] -> <a href="Criticism of Harry Potter">Criticism of <i>Harry Potter</i></a>
+                               $text = $this->doQuotes($text);
                        }
 
                        # Link not escaped by : , create the various objects
@@ -2492,7 +2497,7 @@ class Parser {
         */
        function getVariableValue( $index, $frame=false ) {
                global $wgContLang, $wgSitename, $wgServer, $wgServerName;
-               global $wgScriptPath, $wgStylePath;
+               global $wgArticlePath, $wgScriptPath, $wgStylePath;
 
                /**
                 * Some of these require message or data lookups and can be
@@ -2766,6 +2771,8 @@ class Parser {
                        case 'currentversion':
                                $value = SpecialVersion::getVersion();
                                break;
+                       case 'articlepath':
+                               return $wgArticlePath;
                        case 'sitename':
                                return $wgSitename;
                        case 'server':
@@ -3016,7 +3023,7 @@ class Parser {
                        if ( $id !== false ) {
                                $text = $this->getVariableValue( $id, $frame );
                                if ( MagicWord::getCacheTTL( $id ) > -1 ) {
-                                       $this->mOutput->mContainsOldMagic = true;
+                                       $this->mOutput->updateCacheExpiry( MagicWord::getCacheTTL( $id ) );
                                }
                                $found = true;
                        }
@@ -3311,7 +3318,7 @@ class Parser {
         * Fetch the unparsed text of a template and register a reference to it.
         */
        function fetchTemplateAndTitle( $title ) {
-               $templateCb = $this->mOptions->getTemplateCallback();
+               $templateCb = $this->mOptions->getTemplateCallback(); # Defaults to Parser::statelessFetchTemplate()
                $stuff = call_user_func( $templateCb, $title, $this );
                $text = $stuff['text'];
                $finalTitle = isset( $stuff['finalTitle'] ) ? $stuff['finalTitle'] : $title;
@@ -3491,8 +3498,6 @@ class Parser {
         * @param $frame PPFrame
         */
        function extensionSubstitution( $params, $frame ) {
-               global $wgRawHtml, $wgContLang;
-
                $name = $frame->expand( $params['name'] );
                $attrText = !isset( $params['attr'] ) ? null : $frame->expand( $params['attr'] );
                $content = !isset( $params['inner'] ) ? null : $frame->expand( $params['inner'] );
@@ -3629,7 +3634,6 @@ class Parser {
                        $this->mShowToc = false;
                }
                if ( isset( $this->mDoubleUnderscores['hiddencat'] ) && $this->mTitle->getNamespace() == NS_CATEGORY ) {
-                       $this->mOutput->setProperty( 'hiddencat', 'y' );
                        $this->addTrackingCategory( 'hidden-category-category' );
                }
                # (bug 8068) Allow control over whether robots index a page.
@@ -3644,6 +3648,11 @@ class Parser {
                        $this->mOutput->setIndexPolicy( 'index' );
                        $this->addTrackingCategory( 'index-category' );
                }
+               
+               # Cache all double underscores in the database
+               foreach ( $this->mDoubleUnderscores as $key => $val ) {
+                       $this->mOutput->setProperty( $key, '' );
+               }
 
                wfProfileOut( __METHOD__ );
                return $text;
@@ -3693,16 +3702,12 @@ class Parser {
                global $wgMaxTocLevel, $wgContLang, $wgHtml5, $wgExperimentalHtmlIds;
 
                $doNumberHeadings = $this->mOptions->getNumberHeadings();
-               $showEditLink = $this->mOptions->getEditSection();
-
-               # Do not call quickUserCan unless necessary
-               if ( $showEditLink && !$this->mTitle->quickUserCan( 'edit' ) ) {
-                       $showEditLink = 0;
-               }
-
+               
                # Inhibit editsection links if requested in the page
-               if ( isset( $this->mDoubleUnderscores['noeditsection'] )  || $this->mOptions->getIsPrintable() ) {
+               if ( isset( $this->mDoubleUnderscores['noeditsection'] ) ) {
                        $showEditLink = 0;
+               } else {
+                       $showEditLink = $this->mOptions->getEditSection();
                }
 
                # Get all headlines for numbering them and adding funky stuff like [edit]
@@ -3859,8 +3864,7 @@ class Parser {
 
                        # For the anchor, strip out HTML-y stuff period
                        $safeHeadline = preg_replace( '/<.*?'.'>/', '', $safeHeadline );
-                       $safeHeadline = preg_replace( '/[ _]+/', ' ', $safeHeadline );
-                       $safeHeadline = trim( $safeHeadline );
+                       $safeHeadline = Sanitizer::normalizeSectionNameWhitespace( $safeHeadline );
 
                        # Save headline for section edit hint before it's escaped
                        $headlineHint = $safeHeadline;
@@ -4025,102 +4029,6 @@ class Parser {
                }
        }
 
-       /**
-        * Merge $tree2 into $tree1 by replacing the section with index
-        * $section in $tree1 and its descendants with the sections in $tree2.
-        * Note that in the returned section tree, only the 'index' and
-        * 'byteoffset' fields are guaranteed to be correct.
-        *
-        * @param $tree1 Array: section tree from ParserOutput::getSectons()
-       *  @param $tree2 Array: section tree
-        * @param $section Integer: section index
-        * @param $title Title: Title both section trees come from
-        * @param $len2 Integer: length of the original wikitext for $tree2
-        * @return Array: merged section tree
-        */
-       public static function mergeSectionTrees( $tree1, $tree2, $section, $title, $len2 ) {
-               global $wgContLang;
-               $newTree = array();
-               $targetLevel = false;
-               $merged = false;
-               $lastLevel = 1;
-               $nextIndex = 1;
-               $numbering = array( 0 );
-               $titletext = $title->getPrefixedDBkey();
-               foreach ( $tree1 as $s ) {
-                       if ( $targetLevel !== false ) {
-                               if ( $s['level'] <= $targetLevel ) {
-                                       # We've skipped enough
-                                       $targetLevel = false;
-                               } else {
-                                       continue;
-                               }
-                       }
-                       if ( $s['index'] != $section ||
-                                       $s['fromtitle'] != $titletext ) {
-                               self::incrementNumbering( $numbering,
-                                       $s['toclevel'], $lastLevel );
-
-                               # Rewrite index, byteoffset and number
-                               if ( $s['fromtitle'] == $titletext ) {
-                                       $s['index'] = $nextIndex++;
-                                       if ( $merged ) {
-                                               $s['byteoffset'] += $len2;
-                                       }
-                               }
-                               $s['number']  = implode( '.', array_map(
-                                       array( $wgContLang, 'formatnum' ),
-                                       $numbering ) );
-                               $lastLevel = $s['toclevel'];
-                               $newTree[] = $s;
-                       } else {
-                               # We're at $section
-                               # Insert sections from $tree2 here
-                               foreach ( $tree2 as $s2 ) {
-                                       # Rewrite the fields in $s2
-                                       # before inserting it
-                                       $s2['toclevel'] += $s['toclevel'] - 1;
-                                       $s2['level'] += $s['level'] - 1;
-                                       $s2['index'] = $nextIndex++;
-                                       $s2['byteoffset'] += $s['byteoffset'];
-
-                                       self::incrementNumbering( $numbering,
-                                               $s2['toclevel'], $lastLevel );
-                                       $s2['number']  = implode( '.', array_map(
-                                               array( $wgContLang, 'formatnum' ),
-                                               $numbering ) );
-                                       $lastLevel = $s2['toclevel'];
-                                       $newTree[] = $s2;
-                               }
-                               # Skip all descendants of $section in $tree1
-                               $targetLevel = $s['level'];
-                               $merged = true;
-                       }
-               }
-               return $newTree;
-       }
-
-       /**
-        * Increment a section number. Helper function for mergeSectionTrees()
-        *
-        * @param $number Array representing a section number
-        * @param $level Integer: current TOC level (depth)
-        * @param $lastLevel Integer: level of previous TOC entry
-        */
-       private static function incrementNumbering( &$number, $level, $lastLevel ) {
-               if ( $level > $lastLevel ) {
-                       $number[$level - 1] = 1;
-               } elseif ( $level < $lastLevel ) {
-                       foreach ( $number as $key => $unused )
-                               if ( $key >= $level ) {
-                                       unset( $number[$key] );
-                               }
-                       $number[$level - 1]++;
-               } else {
-                       $number[$level - 1]++;
-               }
-       }
-
        /**
         * Transform wiki markup when saving a page by doing \r\n -> \n
         * conversion, substitting signatures, {{subst:}} templates, etc.
@@ -4869,7 +4777,7 @@ class Parser {
                wfRunHooks( 'ParserMakeImageParams', array( $title, $file, &$params ) );
 
                # Linker does the rest
-               $ret = $sk->makeImageLink2( $title, $file, $params['frame'], $params['handler'], $time, $descQuery );
+               $ret = $sk->makeImageLink2( $title, $file, $params['frame'], $params['handler'], $time, $descQuery, $this->mOptions->getThumbSize() );
 
                # Give the handler a chance to modify the parser object
                if ( $handler ) {
@@ -5133,6 +5041,7 @@ class Parser {
         */
        public function setDefaultSort( $sort ) {
                $this->mDefaultSort = $sort;
+               $this->mOutput->setProperty( 'defaultsort', $sort );
        }
 
        /**
@@ -5142,15 +5051,10 @@ class Parser {
         * @return string
         */
        public function getDefaultSort() {
-               global $wgCategoryPrefixedDefaultSortkey;
                if ( $this->mDefaultSort !== false ) {
                        return $this->mDefaultSort;
-               } elseif ( $this->mTitle->getNamespace() == NS_CATEGORY ||
-                       !$wgCategoryPrefixedDefaultSortkey )
-               {
-                       return $this->mTitle->getText();
                } else {
-                       return $this->mTitle->getPrefixedText();
+                       return $this->mTitle->getCategorySortkey();
                }
        }
 
@@ -5172,19 +5076,23 @@ class Parser {
        public function guessSectionNameFromWikiText( $text ) {
                # Strip out wikitext links(they break the anchor)
                $text = $this->stripSectionName( $text );
-               $headline = Sanitizer::decodeCharReferences( $text );
-               # strip out HTML
-               $headline = StringUtils::delimiterReplace( '<', '>', '', $headline );
-               $headline = trim( $headline );
-               $sectionanchor = '#' . urlencode( str_replace( ' ', '_', $headline ) );
-               $replacearray = array(
-                       '%3A' => ':',
-                       '%' => '.'
-               );
-               return str_replace(
-                       array_keys( $replacearray ),
-                       array_values( $replacearray ),
-                       $sectionanchor );
+               $text = Sanitizer::normalizeSectionNameWhitespace( $text );
+               return '#' . Sanitizer::escapeId( $text, 'noninitial' );
+       }
+
+       /**
+        * Same as guessSectionNameFromWikiText(), but produces legacy anchors
+        * instead.  For use in redirects, since IE6 interprets Redirect: headers
+        * as something other than UTF-8 (apparently?), resulting in breakage.
+        *
+        * @param $text String: The section name
+        * @return string An anchor
+        */
+       public function guessLegacySectionNameFromWikiText( $text ) {
+               # Strip out wikitext links(they break the anchor)
+               $text = $this->stripSectionName( $text );
+               $text = Sanitizer::normalizeSectionNameWhitespace( $text );
+               return '#' . Sanitizer::escapeId( $text, array( 'noninitial', 'legacy' ) );
        }
 
        /**