Remove <a> tag hook for now, pending resolution of implementation issues as discussed...
[lhc/web/wiklou.git] / includes / parser / CoreParserFunctions.php
index e6b613c..d1fe95f 100644 (file)
@@ -16,6 +16,7 @@ class CoreParserFunctions {
 
                $parser->setFunctionHook( 'int',              array( __CLASS__, 'intFunction'      ), SFH_NO_HASH );
                $parser->setFunctionHook( 'ns',               array( __CLASS__, 'ns'               ), SFH_NO_HASH );
+               $parser->setFunctionHook( 'nse',              array( __CLASS__, 'nse'              ), SFH_NO_HASH );
                $parser->setFunctionHook( 'urlencode',        array( __CLASS__, 'urlencode'        ), SFH_NO_HASH );
                $parser->setFunctionHook( 'lcfirst',          array( __CLASS__, 'lcfirst'          ), SFH_NO_HASH );
                $parser->setFunctionHook( 'ucfirst',          array( __CLASS__, 'ucfirst'          ), SFH_NO_HASH );
@@ -38,7 +39,6 @@ class CoreParserFunctions {
                $parser->setFunctionHook( 'numberingroup',    array( __CLASS__, 'numberingroup'    ), SFH_NO_HASH );
                $parser->setFunctionHook( 'numberofedits',    array( __CLASS__, 'numberofedits'    ), SFH_NO_HASH );
                $parser->setFunctionHook( 'numberofviews',    array( __CLASS__, 'numberofviews'    ), SFH_NO_HASH );
-               $parser->setFunctionHook( 'numberofcontribs', array( __CLASS__, 'numberofcontribs' ), SFH_NO_HASH );
                $parser->setFunctionHook( 'language',         array( __CLASS__, 'language'         ), SFH_NO_HASH );
                $parser->setFunctionHook( 'padleft',          array( __CLASS__, 'padleft'          ), SFH_NO_HASH );
                $parser->setFunctionHook( 'padright',         array( __CLASS__, 'padright'         ), SFH_NO_HASH );
@@ -67,16 +67,8 @@ class CoreParserFunctions {
                $parser->setFunctionHook( 'talkpagenamee',    array( __CLASS__, 'talkpagenamee'    ), SFH_NO_HASH );
                $parser->setFunctionHook( 'subjectpagename',  array( __CLASS__, 'subjectpagename'  ), SFH_NO_HASH );
                $parser->setFunctionHook( 'subjectpagenamee', array( __CLASS__, 'subjectpagenamee' ), SFH_NO_HASH );
-               $parser->setFunctionHook( 'revisionid',       array( __CLASS__, 'revisionid'       ), SFH_NO_HASH );
-               $parser->setFunctionHook( 'revisiontimestamp',array( __CLASS__, 'revisiontimestamp'), SFH_NO_HASH );
-               $parser->setFunctionHook( 'revisionday',      array( __CLASS__, 'revisionday'      ), SFH_NO_HASH );
-               $parser->setFunctionHook( 'revisionday2',     array( __CLASS__, 'revisionday2'     ), SFH_NO_HASH );
-               $parser->setFunctionHook( 'revisionmonth',    array( __CLASS__, 'revisionmonth'    ), SFH_NO_HASH );
-               $parser->setFunctionHook( 'revisionyear',     array( __CLASS__, 'revisionyear'     ), SFH_NO_HASH );
-               $parser->setFunctionHook( 'revisionuser',     array( __CLASS__, 'revisionuser'     ), SFH_NO_HASH );
                $parser->setFunctionHook( 'tag',              array( __CLASS__, 'tagObj'           ), SFH_OBJECT_ARGS );
                $parser->setFunctionHook( 'formatdate',           array( __CLASS__, 'formatDate'           ) );
-               $parser->setFunctionHook( 'groupconvert',         array( __CLASS__, 'groupconvert'         ), SFH_NO_HASH );
 
                if ( $wgAllowDisplayTitle ) {
                        $parser->setFunctionHook( 'displaytitle', array( __CLASS__, 'displaytitle' ), SFH_NO_HASH );
@@ -97,23 +89,23 @@ class CoreParserFunctions {
                        return array( 'found' => false );
                }
        }
-       
+
        static function formatDate( $parser, $date, $defaultPref = null ) {
                $df = DateFormatter::getInstance();
-               
+
                $date = trim($date);
-               
+
                $pref = $parser->mOptions->getDateFormat();
-               
+
                // Specify a different default date format other than the the normal default
-               // iff the user has 'default' for their setting         
+               // iff the user has 'default' for their setting
                if ($pref == 'default' && $defaultPref)
                        $pref = $defaultPref;
-               
+
                $date = $df->reformat( $pref, $date, array('match-whole') );
                return $date;
        }
-       
+
        static function ns( $parser, $part1 = '' ) {
                global $wgContLang;
                if ( intval( $part1 ) || $part1 == "0" ) {
@@ -127,6 +119,10 @@ class CoreParserFunctions {
                        return array( 'found' => false );
                }
        }
+       
+       static function nse( $parser, $part1 = '' ) {
+               return wfUrlencode( str_replace( ' ', '_', self::ns( $parser, $part1 ) ) );
+       }
 
        static function urlencode( $parser, $s = '' ) {
                return urlencode( $s );
@@ -202,14 +198,15 @@ class CoreParserFunctions {
        }
 
        static function gender( $parser, $user ) {
+               wfProfileIn( __METHOD__ );
                $forms = array_slice( func_get_args(), 2);
 
                // default
                $gender = User::getDefaultOption( 'gender' );
-               
+
                // allow prefix.
                $title = Title::newFromText( $user );
-               
+
                if (is_object( $title ) && $title->getNamespace() == NS_USER)
                        $user = $title->getText();
 
@@ -221,7 +218,9 @@ class CoreParserFunctions {
                        global $wgUser;
                        $gender = $wgUser->getOption( 'gender' );
                }
-               return $parser->getFunctionLang()->gender( $gender, $forms );
+               $ret = $parser->getFunctionLang()->gender( $gender, $forms );
+               wfProfileOut( __METHOD__ );
+               return $ret;
        }
        static function plural( $parser, $text = '') {
                $forms = array_slice( func_get_args(), 2);
@@ -239,13 +238,21 @@ class CoreParserFunctions {
         */
        static function displaytitle( $parser, $text = '' ) {
                global $wgRestrictDisplayTitle;
-               
+
+               #parse a limited subset of wiki markup (just the single quote items)
+               $text = $parser->doQuotes( $text );
+
+               #remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever
+               $text = preg_replace( '/' . preg_quote( $parser->uniqPrefix(), '/' ) . '.*?'
+                       . preg_quote( Parser::MARKER_SUFFIX, '/' ) . '/', '', $text );
+
                #list of disallowed tags for DISPLAYTITLE
                #these will be escaped even though they are allowed in normal wiki text
-               $bad = array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'blockquote', 'ol', 'ul', 'li',
-                       'table', 'tr', 'th', 'td', 'dl', 'dd', 'caption', 'p', 'ruby', 'rb', 'rt', 'rp' );
-               
+               $bad = array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'blockquote', 'ol', 'ul', 'li', 'hr',
+                       'table', 'tr', 'th', 'td', 'dl', 'dd', 'caption', 'p', 'ruby', 'rb', 'rt', 'rp', 'br' );
+
                #only requested titles that normalize to the actual title are allowed through
+               #if $wgRestrictDisplayTitle is true (it is by default)
                #mimic the escaping process that occurs in OutputPage::setPageTitle
                $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $text, null, array(), array(), $bad ) );
                $title = Title::newFromText( Sanitizer::stripAllTags( $text ) );
@@ -310,9 +317,9 @@ class CoreParserFunctions {
        }
        static function numberingroup( $parser, $name = '', $raw = null) {
                return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
-       } 
+       }
+
 
-       
        /**
         * Given a title, return the namespace name that would be given by the
         * corresponding magic word
@@ -406,7 +413,7 @@ class CoreParserFunctions {
                if ( is_null($t) )
                        return '';
                return wfUrlEncode( str_replace( ' ', '_', $t->getBaseText() ) );
-       }       
+       }
        static function talkpagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null($t) || !$t->canTalk() )
@@ -431,91 +438,7 @@ class CoreParserFunctions {
                        return '';
                return $t->getSubjectPage()->getPrefixedUrl();
        }
-       /*
-        * Functions to get revision informations, corresponding to the magic words
-        * of the same names
-        */
-       static function revisionid( $parser, $title = null ) {
-               static $cache = array ();
-               $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
-                       return '';
-               if ( $t->equals( $parser->getTitle() ) ) {
-                       // Let the edit saving system know we should parse the page
-                       // *after* a revision ID has been assigned.
-                       $parser->mOutput->setFlag( 'vary-revision' );
-                       wfDebug( __METHOD__ . ": {{REVISIONID}} used, setting vary-revision...\n" );
-                       return $parser->getRevisionId();
-               }
-               if ( isset( $cache[$t->getPrefixedText()] ) )
-                       return $cache[$t->getPrefixedText()];
-               elseif ( $parser->incrementExpensiveFunctionCount() ) {
-                       $a = new Article( $t );
-                       return $cache[$t->getPrefixedText()] = $a->getRevIdFetched();
-               }
-               return '';
-       }
-       static function revisiontimestamp( $parser, $title = null ) {
-               static $cache = array ();
-               $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
-                       return '';
-               if ( $t->equals( $parser->getTitle() ) ) {
-                       // Let the edit saving system know we should parse the page
-                       // *after* a revision ID has been assigned. This is for null edits.
-                       $parser->mOutput->setFlag( 'vary-revision' );
-                       wfDebug( __METHOD__ . ": {{REVISIONTIMESTAMP}} or related parser function used, setting vary-revision...\n" );
-                       return $parser->getRevisionTimestamp();
-               }
-               if ( isset( $cache[$t->getPrefixedText()] ) )
-                       return $cache[$t->getPrefixedText()];
-               elseif ( $parser->incrementExpensiveFunctionCount() ) {
-                       $a = new Article( $t );
-                       return $cache[$t->getPrefixedText()] = $a->getTimestamp();
-               }
-               return '';
-       }
-       static function revisionday( $parser, $title = null ) {
-               $timestamp = self::revisiontimestamp( $parser, $title );
-               if ( $timestamp == '' ) return '';
-               return intval( substr( $timestamp, 6, 2 ) );
-       }
-       static function revisionday2( $parser, $title = null ) {
-               $timestamp = self::revisiontimestamp( $parser, $title );
-               if ( $timestamp == '' ) return '';
-               return substr( $timestamp, 6, 2 );
-       }
-       static function revisionmonth( $parser, $title = null ) {
-               $timestamp = self::revisiontimestamp( $parser, $title );
-               if ( $timestamp == '' ) return '';
-               return intval( substr( $timestamp, 4, 2 ) );
-       }
-       static function revisionyear( $parser, $title = null ) {
-               $timestamp = self::revisiontimestamp( $parser, $title );
-               if ( $timestamp == '' ) return '';
-               return substr( $timestamp, 0, 4 );
-       }
-       static function revisionuser( $parser, $title = null ) {
-               static $cache = array();
-               $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
-                       return '';
-               if ( $t->equals( $parser->getTitle() ) ) {
-                       // Let the edit saving system know we should parse the page
-                       // *after* a revision ID has been assigned. This is for null edits.
-                       $parser->mOutput->setFlag( 'vary-revision' );
-                       wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-revision...\n" );
-                       return $parser->getRevisionUser();
-               }
-               if ( isset( $cache[$t->getPrefixedText()] ) )
-                       return $cache[$t->getPrefixedText()];
-               elseif ( $parser->incrementExpensiveFunctionCount() ) {
-                       $a = new Article( $t );
-                       return $cache[$t->getPrefixedText()] = $a->getUserText();
-               }
-               return '';
-       }
-       
+
        /**
         * Return the number of pages in the given category, or 0 if it's nonexis-
         * tent.  This is an expensive parser function and can't be called too many
@@ -572,13 +495,13 @@ class CoreParserFunctions {
                        $rev = Revision::newFromTitle($title);
                        $id = $rev ? $rev->getPage() : 0;
                        $length = $cache[$page] = $rev ? $rev->getSize() : 0;
-                       
+
                        // Register dependency in templatelinks
                        $parser->mOutput->addTemplate( $title, $id, $rev ? $rev->getId() : 0 );
-               }       
+               }
                return self::formatRaw( $length, $raw );
        }
-       
+
        /**
        * Returns the requested protection level for the current page
        */
@@ -594,33 +517,17 @@ class CoreParserFunctions {
                $lang = $wgContLang->getLanguageName( strtolower( $arg ) );
                return $lang != '' ? $lang : $arg;
        }
-       
-       /**
-       * Returns the number of contributions by a certain user. This is an 
-       * expensive parser function and can't be called too many times per page
-       */
-       static function numberofcontribs( $parser, $user = null, $raw = null ) {
-               if ( is_null($user) || !User::isValidUserName( $user ) ) {
-                       return '';
-               }
-               if ( !$parser->incrementExpensiveFunctionCount() ) {
-                       return '';
-               }
-               $u = User::newFromName( $user );
-               $id = User::idFromName( $u->mName );
-               return self::formatRaw( User::edits( $id ), $raw );
-       }
 
        /**
         * Unicode-safe str_pad with the restriction that $length is forced to be <= 500
         */
        static function pad( $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) {
-               $lengthOfPadding = mb_strlen( $padding );               
+               $lengthOfPadding = mb_strlen( $padding );
                if ( $lengthOfPadding == 0 ) return $string;
-               
+
                # The remaining length to add counts down to 0 as padding is added
                $length = min( $length, 500 ) - mb_strlen( $string );
-               # $finalPadding is just $padding repeated enough times so that 
+               # $finalPadding is just $padding repeated enough times so that
                # mb_strlen( $string ) + mb_strlen( $finalPadding ) == $length
                $finalPadding = '';
                while ( $length > 0 ) {
@@ -629,7 +536,7 @@ class CoreParserFunctions {
                        $finalPadding .= mb_substr( $padding, 0, $length );
                        $length -= $lengthOfPadding;
                }
-               
+
                if ( $direction == STR_PAD_LEFT ) {
                        return $finalPadding . $string;
                } else {
@@ -735,12 +642,4 @@ class CoreParserFunctions {
                );
                return $parser->extensionSubstitution( $params, $frame );
        }
-       
-       /**
-        * magic word call for a group convert from LanguageConverter.
-        */
-       public static function groupconvert( $parser, $group ) {
-               global $wgContLang;
-               return $wgContLang->groupConvert( $group );
-       }
 }