* (bug 6201) Treat spaces as underscores in parameters to {{ns:}}
[lhc/web/wiklou.git] / includes / Parser.php
index 82e2211..c6098d5 100644 (file)
@@ -473,7 +473,7 @@ class Parser
                                        $output = MathRenderer::renderMath( $content );
                                        break;
                                case 'gallery':
-                                       $output = $this->renderImageGallery( $content );
+                                       $output = $this->renderImageGallery( $content, $params );
                                        break;
                                default:
                                        if( isset( $this->mTagHooks[$tagName] ) ) {
@@ -843,6 +843,7 @@ class Parser
                $text = preg_replace( '/(^|\n)-----*/', '\\1<hr />', $text );
 
                $text = $this->stripToc( $text );
+               $this->stripNoGallery( $text );
                $text = $this->doHeadings( $text );
                if($this->mOptions->getUseDynamicDates()) {
                        $df =& DateFormatter::getInstance();
@@ -1144,6 +1145,9 @@ class Parser
                        # Normalize any HTML entities in input. They will be
                        # re-escaped by makeExternalLink().
                        $url = Sanitizer::decodeCharReferences( $url );
+                       
+                       # Escape any control characters introduced by the above step
+                       $url = preg_replace( '/[\][<>"\\x00-\\x20\\x7F]/e', "urlencode('\\0')", $url );
 
                        # Process the trail (i.e. everything after this link up until start of the next link),
                        # replacing any non-bracketed links
@@ -1227,6 +1231,9 @@ class Parser
                                # Normalize any HTML entities in input. They will be
                                # re-escaped by makeExternalLink() or maybeMakeExternalImage()
                                $url = Sanitizer::decodeCharReferences( $url );
+                               
+                               # Escape any control characters introduced by the above step
+                               $url = preg_replace( '/[\][<>"\\x00-\\x20\\x7F]/e', "urlencode('\\0')", $url );
 
                                # Is this an external image?
                                $text = $this->maybeMakeExternalImage( $url );
@@ -1535,6 +1542,7 @@ class Parser
                                                $sortkey = $text;
                                        }
                                        $sortkey = Sanitizer::decodeCharReferences( $sortkey );
+                                       $sortkey = str_replace( "\n", '', $sortkey );
                                        $sortkey = $wgContLang->convertCategoryKey( $sortkey );
                                        $this->mOutput->addCategory( $nt->getDBkey(), $sortkey );
 
@@ -2242,6 +2250,8 @@ class Parser
                                return $varCache[$index] = $wgContLang->formatNum( wfNumberOfUsers() );
                        case MAG_NUMBEROFPAGES:
                                return $varCache[$index] = $wgContLang->formatNum( wfNumberOfPages() );
+                       case MAG_NUMBEROFADMINS:
+                               return $varCache[$index]  = $wgContLang->formatNum( wfNumberOfAdmins() );
                        case MAG_CURRENTTIMESTAMP:
                                return $varCache[$index] = wfTimestampNow();
                        case MAG_CURRENTVERSION:
@@ -2406,7 +2416,7 @@ class Parser
                                                                                 'text' => substr($text, $pieceStart, $pieceEnd - $pieceStart),
                                                                                 'title' => trim($openingBraceStack[$lastOpeningBrace]['title']),
                                                                                 'parts' => $openingBraceStack[$lastOpeningBrace]['parts'],
-                                                                                'lineStart' => (($pieceStart > 0) && ($text[$pieceStart-1] == '\n')),
+                                                                                'lineStart' => (($pieceStart > 0) && ($text[$pieceStart-1] == "\n")),
                                                                                 );
                                                # finally we can call a user callback and replace piece of text
                                                $replaceWith = call_user_func( $matchingCallback, $cbArgs );
@@ -2663,7 +2673,8 @@ class Parser
                                        $text = $linestart . $wgContLang->getNsText( intval( $part1 ) );
                                        $found = true;
                                } else {
-                                       $index = Namespace::getCanonicalIndex( strtolower( $part1 ) );
+                                       $param = str_replace( ' ', '_', strtolower( $part1 ) );
+                                       $index = Namespace::getCanonicalIndex( strtolower( $param ) );
                                        if ( !is_null( $index ) ) {
                                                $text = $linestart . $wgContLang->getNsText( $index );
                                                $found = true;
@@ -2787,12 +2798,13 @@ class Parser
                        $mwWordsToCheck = array( MAG_NUMBEROFPAGES => 'wfNumberOfPages',
                                                                         MAG_NUMBEROFUSERS => 'wfNumberOfUsers',
                                                                         MAG_NUMBEROFARTICLES => 'wfNumberOfArticles',
-                                                                        MAG_NUMBEROFFILES => 'wfNumberOfFiles' );
+                                                                        MAG_NUMBEROFFILES => 'wfNumberOfFiles',
+                                                                        MAG_NUMBEROFADMINS => 'wfNumberOfAdmins' );
                        foreach( $mwWordsToCheck as $word => $func ) {
                                $mwCurrentWord =& MagicWord::get( $word );
                                if( $mwCurrentWord->matchStartAndRemove( $part1 ) ) {
                                        $mwRawSuffix =& MagicWord::get( MAG_RAWSUFFIX );
-                                       if( $mwRawSuffix->match( $args[0] ) ) {
+                                       if( isset( $args[0] ) && $mwRawSuffix->match( $args[0] ) ) {
                                                # Raw and unformatted
                                                $text = $linestart . call_user_func( $func );
                                        } else {
@@ -2834,6 +2846,17 @@ class Parser
                        $colonPos = strpos( $part1, ':' );
                        if ( $colonPos !== false ) {
                                $function = strtolower( substr( $part1, 1, $colonPos - 1 ) );
+                               if ( !isset( $this->mFunctionHooks[$function] ) ) {
+                                       foreach ($this->mFunctionHooks as $key => $value) {
+                                               if( is_int( $key ) ) {
+                                                       $mwExtension =& MagicWord::get( $key );
+                                                       if( $mwExtension->matchVariableStartToEnd( $function ) ) {
+                                                               $function = $key;
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
                                if ( isset( $this->mFunctionHooks[$function] ) ) {
                                        $funcArgs = array_map( 'trim', $args );
                                        $funcArgs = array_merge( array( &$this, trim( substr( $part1, $colonPos + 1 ) ) ), $funcArgs );
@@ -2894,7 +2917,14 @@ class Parser
                        }
                        $title = Title::newFromText( $part1, $ns );
 
+
                        if ( !is_null( $title ) ) {
+                               $checkVariantLink = sizeof($wgContLang->getVariants())>1;
+                               # Check for language variants if the template is not found
+                               if($checkVariantLink && $title->getArticleID() == 0){
+                                       $wgContLang->findVariantLink($part1, $title);
+                               }
+
                                if ( !$title->isExternal() ) {
                                        # Check for excessive inclusion
                                        $dbk = $title->getPrefixedDBkey();
@@ -3172,6 +3202,16 @@ class Parser
                }
        }
 
+       /**
+        * Detect __NOGALLERY__ magic word and set a placeholder
+        */
+       function stripNoGallery( &$text ) {
+               # if the string __NOGALLERY__ (not case-sensitive) occurs in the HTML,
+               # do not add TOC
+               $mw = MagicWord::get( MAG_NOGALLERY );
+               $this->mOutput->mNoGallery = $mw->matchAndRemove( $text ) ;
+       }
+
        /**
         * Detect __TOC__ magic word and set a placeholder
         */
@@ -3714,6 +3754,9 @@ class Parser
                        }
                }
 
+               // Make sure nickname doesnt get a sig in a sig
+               $nickname = $this->cleanSigInSig( $nickname );
+
                # If we're still here, make it a link to the user page
                $userpage = $user->getUserPage();
                return( '[[' . $userpage->getPrefixedText() . '|' . wfEscapeWikiText( $nickname ) . ']]' );
@@ -3732,7 +3775,7 @@ class Parser
        /**
         * Clean up signature text
         *
-        * 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures
+        * 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures @see cleanSigInSig
         * 2) Substitute all transclusions
         *
         * @param string $text
@@ -3748,12 +3791,22 @@ class Parser
                $substText = '{{' . $substWord->getSynonym( 0 );
 
                $text = preg_replace( $substRegex, $substText, $text );
-               $text = preg_replace( '/~{3,5}/', '', $text );
+               $text = $this->cleanSigInSig( $text );
                $text = $this->replaceVariables( $text );
                
                $this->clearState();    
                return $text;
        }
+
+       /**
+        * Strip ~~~, ~~~~ and ~~~~~ out of signatures
+        * @param string $text
+        * @return string Signature text with /~{3,5}/ removed
+        */
+       function cleanSigInSig( $text ) {
+               $text = preg_replace( '/~{3,5}/', '', $text );
+               return $text;
+       }
        
        /**
         * Set up some variables which are usually set up in parse()
@@ -3842,15 +3895,17 @@ class Parser
         *
         * @public
         *
-        * @param string $name The function name. Function names are case-insensitive.
+        * @param mixed $id The magic word ID, or (deprecated) the function name. Function names are case-insensitive.
         * @param mixed $callback The callback function (and object) to use
         *
         * @return The old callback function for this name, if any
         */
-       function setFunctionHook( $name, $callback ) {
-               $name = strtolower( $name );
-               $oldVal = @$this->mFunctionHooks[$name];
-               $this->mFunctionHooks[$name] = $callback;
+       function setFunctionHook( $id, $callback ) {
+               if( is_string( $id ) ) {
+                       $id = strtolower( $id );
+               }
+               $oldVal = @$this->mFunctionHooks[$id];
+               $this->mFunctionHooks[$id] = $callback;
                return $oldVal;
        }
 
@@ -4076,13 +4131,17 @@ class Parser
         * labeled 'The number "1"' and
         * 'A tree'.
         */
-       function renderImageGallery( $text ) {
+       function renderImageGallery( $text, $params ) {
                $ig = new ImageGallery();
                $ig->setShowBytes( false );
                $ig->setShowFilename( false );
                $ig->setParsing();
-               $lines = explode( "\n", $text );
+               $ig->useSkin( $this->mOptions->getSkin() );
 
+               if( isset( $params['caption'] ) )
+                       $ig->setCaption( $params['caption'] );
+               
+               $lines = explode( "\n", $text );
                foreach ( $lines as $line ) {
                        # match lines like these:
                        # Image:someimage.jpg|This is some image
@@ -4306,7 +4365,7 @@ class Parser
                                (=+) # Should this be limited to 6?
                                .+?  # Section title...
                                \\2  # Ending = count must match start
-                               (?:$comment|<\/?noinclude>|\s+)* # Trailing whitespace ok
+                               (?:$comment|<\/?noinclude>|[ \\t]+)* # Trailing whitespace ok
                                $
                        |
                                <h([1-6])\b.*?>
@@ -4424,7 +4483,8 @@ class ParserOutput
                $mExternalLinks,    # External link URLs, in the key only
                $mHTMLtitle,            # Display HTML title
                $mSubtitle,                     # Additional subtitle
-               $mNewSection;           # Show a new section link?
+               $mNewSection,           # Show a new section link?
+               $mNoGallery;            # No gallery on category page? (__NOGALLERY__)
 
        function ParserOutput( $text = '', $languageLinks = array(), $categoryLinks = array(),
                $containsOldMagic = false, $titletext = '' )
@@ -4443,6 +4503,7 @@ class ParserOutput
                $this->mHTMLtitle = "" ;
                $this->mSubtitle = "" ;
                $this->mNewSection = false;
+               $this->mNoGallery = false;
        }
 
        function getText()                   { return $this->mText; }
@@ -4455,6 +4516,7 @@ class ParserOutput
        function &getTemplates()             { return $this->mTemplates; }
        function &getImages()                { return $this->mImages; }
        function &getExternalLinks()         { return $this->mExternalLinks; }
+       function getNoGallery()              { return $this->mNoGallery; }
 
        function containsOldMagic()          { return $this->mContainsOldMagic; }
        function setText( $text )            { return wfSetVar( $this->mText, $text ); }
@@ -4663,6 +4725,22 @@ function wfNumberOfPages() {
        return (int)$count;
 }
 
+/**
+ * Return the total number of admins
+ *
+ * @return integer
+ */
+function wfNumberOfAdmins() {
+       static $admins = -1;
+       wfProfileIn( 'wfNumberOfAdmins' );
+       if( $admins == -1 ) {
+               $dbr =& wfGetDB( DB_SLAVE );
+               $admins = $dbr->selectField( 'user_groups', 'COUNT(*)', array( 'ug_group' => 'sysop' ), 'wfNumberOfAdmins' );
+       }
+       wfProfileOut( 'wfNumberOfAdmins' );
+       return (int)$admins;
+}
+
 /**
  * Count the number of pages in a particular namespace
  *