when $threshold is 0, page_len and page_is_redirect are not present in $s; causes...
[lhc/web/wiklou.git] / includes / Parser.php
index efaf303..2d053e7 100644 (file)
@@ -1,5 +1,7 @@
 <?php
+
 /**
+ *
  * File for Parser and related classes
  *
  * @addtogroup Parser
@@ -86,6 +88,7 @@ define( 'MW_COLON_STATE_COMMENTDASHDASH', 7 );
  *  * only within ParserOptions
  * </pre>
  *
+ * @addtogroup Parser
  */
 class Parser
 {
@@ -95,7 +98,7 @@ class Parser
         */
        # Persistent:
        var $mTagHooks, $mFunctionHooks, $mFunctionSynonyms, $mVariables;
-
+       
        # Cleared with clearState():
        var $mOutput, $mAutonumber, $mDTopen, $mStripState;
        var $mIncludeCount, $mArgStack, $mLastSection, $mInPre;
@@ -129,7 +132,7 @@ class Parser
                $this->mFunctionSynonyms = array( 0 => array(), 1 => array() );
                $this->mFirstCall = true;
        }
-
+       
        /**
         * Do various kinds of initialisation on the first call of the parser
         */
@@ -137,12 +140,12 @@ class Parser
                if ( !$this->mFirstCall ) {
                        return;
                }
-
+               
                wfProfileIn( __METHOD__ );
                global $wgAllowDisplayTitle, $wgAllowSlowParserFunctions;
-
+               
                $this->setHook( 'pre', array( $this, 'renderPreTag' ) );
-
+               
                $this->setFunctionHook( 'int', array( 'CoreParserFunctions', 'intFunction' ), SFH_NO_HASH );
                $this->setFunctionHook( 'ns', array( 'CoreParserFunctions', 'ns' ), SFH_NO_HASH );
                $this->setFunctionHook( 'urlencode', array( 'CoreParserFunctions', 'urlencode' ), SFH_NO_HASH );
@@ -1002,7 +1005,7 @@ class Parser
                $text = Sanitizer::removeHTMLtags( $text, array( &$this, 'attributeStripCallback' ) );
 
                $text = $this->replaceVariables( $text, $args );
-               wfRunHooks( 'InternalParseBeforeLinks', array( &$this, &$text ) );
+               wfRunHooks( 'InternalParseBeforeLinks', array( &$this, &$text, &$this->mStripState ) );
 
                // Tables need to come after variable replacement for things to work
                // properly; putting them before other transformations should keep
@@ -1926,6 +1929,7 @@ class Parser
                        # Look at the first character
                        if( $target != '' && $target{0} == '/' ) {
                                # / at end means we don't want the slash to be shown
+                               $m = array();
                                $trailingSlashes = preg_match_all( '%(/+)$%', $target, $m );
                                if( $trailingSlashes ) {
                                        $noslash = $target = substr( $target, 1, -strlen($m[0][0]) );
@@ -3088,7 +3092,7 @@ class Parser
                                                $found = false; //access denied
                                                wfDebug( "$fname: template inclusion denied for " . $title->getPrefixedDBkey() );
                                        } else {
-                                               $articleContent = $this->fetchTemplate( $title );
+                                               list($articleContent,$title) = $this->fetchTemplateAndtitle( $title );
                                                if ( $articleContent !== false ) {
                                                        $found = true;
                                                        $text = $articleContent;
@@ -3219,6 +3223,7 @@ class Parser
                                                PREG_SPLIT_DELIM_CAPTURE);
                                        $text = '';
                                        $nsec = $headingOffset;
+
                                        for( $i = 0; $i < count($m); $i += 2 ) {
                                                $text .= $m[$i];
                                                if (!isset($m[$i + 1]) || $m[$i + 1] == "") continue;
@@ -3254,8 +3259,9 @@ class Parser
        /**
         * Fetch the unparsed text of a template and register a reference to it.
         */
-       function fetchTemplate( $title ) {
+       function fetchTemplateAndtitle( $title ) {
                $text = false;
+               $finalTitle = $title;
                // Loop to fetch the article, with up to 1 redirect
                for ( $i = 0; $i < 2 && is_object( $title ); $i++ ) {
                        $rev = Revision::newFromTitle( $title );
@@ -3277,9 +3283,15 @@ class Parser
                                break;
                        }
                        // Redirect?
+                       $finalTitle = $title;
                        $title = Title::newFromRedirect( $text );
                }
-               return $text;
+               return array($text,$finalTitle);
+       }
+
+       function fetchTemplate( $title ) {
+               $rv = $this->fetchTemplateAndtitle($title);
+               return $rv[0];
        }
 
        /**
@@ -3452,17 +3464,13 @@ class Parser
                        $enoughToc = true;
                }
 
-               # Never ever show TOC if no headers
-               if( $numMatches < 1 ) {
-                       $enoughToc = false;
-               }
-
                # We need this to perform operations on the HTML
                $sk = $this->mOptions->getSkin();
 
                # headline counter
                $headlineCount = 0;
                $sectionCount = 0; # headlineCount excluding template sections
+               $numVisible = 0;
 
                # Ugh .. the TOC should have neat indentation levels which can be
                # passed to the skin functions. These are determined here
@@ -3503,7 +3511,9 @@ class Parser
                                        $toclevel++;
                                        $sublevelCount[$toclevel] = 0;
                                        if( $toclevel<$wgMaxTocLevel ) {
+                                               $prevtoclevel = $toclevel;
                                                $toc .= $sk->tocIndent();
+                                               $numVisible++;
                                        }
                                }
                                elseif ( $level < $prevlevel && $toclevel > 1 ) {
@@ -3527,7 +3537,12 @@ class Parser
                                                }
                                        }
                                        if( $toclevel<$wgMaxTocLevel ) {
-                                               $toc .= $sk->tocUnindent( $prevtoclevel - $toclevel );
+                                               if($prevtoclevel < $wgMaxTocLevel) {
+                                                       # Unindent only if the previous toc level was shown :p
+                                                       $toc .= $sk->tocUnindent( $prevtoclevel - $toclevel );
+                                               } else {
+                                                       $toc .= $sk->tocLineEnd();
+                                               }
                                        }
                                }
                                else {
@@ -3610,9 +3625,14 @@ class Parser
                                $sectionCount++;
                }
 
+               # Never ever show TOC if no headers
+               if( $numVisible < 1 ) {
+                       $enoughToc = false;
+               }
+               
                if( $enoughToc ) {
-                       if( $toclevel<$wgMaxTocLevel ) {
-                               $toc .= $sk->tocUnindent( $toclevel - 1 );
+                       if( $prevtoclevel > 0 && $prevtoclevel < $wgMaxTocLevel ) {
+                               $toc .= $sk->tocUnindent( $prevtoclevel - 1 );
                        }
                        $toc = $sk->tocList( $toc );
                }
@@ -4054,16 +4074,11 @@ class Parser
                                        $linkCache->addGoodLinkObj( $s->page_id, $title );
                                        $this->mOutput->addLink( $title, $s->page_id );
 
-                                       if ( $threshold >  0 ) {
-                                               $size = $s->page_len;
-                                               if ( $s->page_is_redirect || $s->page_namespace != 0 || $size >= $threshold ) {
-                                                       $colours[$pdbk] = 1;
-                                               } else {
-                                                       $colours[$pdbk] = 2;
-                                               }
-                                       } else {
-                                               $colours[$pdbk] = 1;
-                                       }
+                                       $colours[$pdbk] = ( $threshold == 0 || (
+                                                               $s->page_len >= $threshold || # always true if $threshold <= 0
+                                                               $s->page_is_redirect ||
+                                                               !Namespace::isContent( $s->page_namespace ) )
+                                                           ? 1 : 2 );
                                }
                        }
                        wfProfileOut( $fname.'-check' );
@@ -4386,8 +4401,8 @@ class Parser
         * Parse image options text and use it to make an image
         */
        function makeImage( $nt, $options ) {
-               global $wgUseImageResize, $wgDjvuRenderer;
-
+               # @TODO: let the MediaHandler specify its transform parameters
+               #
                # Check if the options text is of the form "options|alt text"
                # Options are:
                #  * thumbnail          make a thumbnail with enlarge-icon and caption, alignment depends on lang
@@ -4407,6 +4422,7 @@ class Parser
                #  * bottom
                #  * text-bottom
 
+
                $part = array_map( 'trim', explode( '|', $options) );
 
                $mwAlign = array();
@@ -4421,13 +4437,14 @@ class Parser
                $mwPage   =& MagicWord::get( 'img_page' );
                $caption = '';
 
-               $width = $height = $framed = $thumb = false;
-               $page = null;
+               $params = array();
+               $framed = $thumb = false;
                $manual_thumb = '' ;
                $align = $valign = '';
+               $sk = $this->mOptions->getSkin();
 
                foreach( $part as $val ) {
-                       if ( $wgUseImageResize && ! is_null( $mwThumb->matchVariableStartToEnd($val) ) ) {
+                       if ( !is_null( $mwThumb->matchVariableStartToEnd($val) ) ) {
                                $thumb=true;
                        } elseif ( ! is_null( $match = $mwManualThumb->matchVariableStartToEnd($val) ) ) {
                                # use manually specified thumbnail
@@ -4445,19 +4462,18 @@ class Parser
                                                continue 2;
                                        }
                                }
-                               if ( isset( $wgDjvuRenderer ) && $wgDjvuRenderer
-                               && ! is_null( $match = $mwPage->matchVariableStartToEnd($val) ) ) {
+                               if ( ! is_null( $match = $mwPage->matchVariableStartToEnd($val) ) ) {
                                        # Select a page in a multipage document
-                                       $page = $match;
-                               } elseif ( $wgUseImageResize && !$width && ! is_null( $match = $mwWidth->matchVariableStartToEnd($val) ) ) {
+                                       $params['page'] = $match;
+                               } elseif ( !isset( $params['width'] ) && ! is_null( $match = $mwWidth->matchVariableStartToEnd($val) ) ) {
                                        wfDebug( "img_width match: $match\n" );
                                        # $match is the image width in pixels
                                        $m = array();
                                        if ( preg_match( '/^([0-9]*)x([0-9]*)$/', $match, $m ) ) {
-                                               $width = intval( $m[1] );
-                                               $height = intval( $m[2] );
+                                                $params['width'] = intval( $m[1] );
+                                                $params['height'] = intval( $m[2] );
                                        } else {
-                                               $width = intval($match);
+                                               $params['width'] = intval($match);
                                        }
                                } elseif ( ! is_null( $mwFramed->matchVariableStartToEnd($val) ) ) {
                                        $framed=true;
@@ -4476,8 +4492,7 @@ class Parser
                $alt = Sanitizer::stripAllTags( $alt );
 
                # Linker does the rest
-               $sk = $this->mOptions->getSkin();
-               return $sk->makeImageLinkObj( $nt, $caption, $alt, $align, $width, $height, $framed, $thumb, $manual_thumb, $page, $valign );
+               return $sk->makeImageLinkObj( $nt, $caption, $alt, $align, $params, $framed, $thumb, $manual_thumb, $valign );
        }
 
        /**
@@ -4721,6 +4736,7 @@ class Parser
 
 /**
  * @todo document, briefly.
+ * @addtogroup Parser
  */
 class OnlyIncludeReplacer {
        var $output = '';
@@ -4736,6 +4752,7 @@ class OnlyIncludeReplacer {
 
 /**
  * @todo document, briefly.
+ * @addtogroup Parser
  */
 class StripState {
        var $general, $nowiki;