X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fparser%2FCoreParserFunctions.php;h=58c57714a8f4588aa4561ab918cf5e0ae0d93e8a;hb=c7e85a5e04b4bba68222e79fbca67878af164b5d;hp=9d656d2ec14a20341280a657b070a7c88c6d07a7;hpb=1a58e8f93e6fa2a99ed86cc9d66dc71bf08b7b73;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php index 9d656d2ec1..58c57714a8 100644 --- a/includes/parser/CoreParserFunctions.php +++ b/includes/parser/CoreParserFunctions.php @@ -11,11 +11,12 @@ class CoreParserFunctions { # Syntax for arguments (see self::setFunctionHook): # "name for lookup in localized magic words array", # function callback, - # optional SFH_NO_HASH to omit the hash from calls (e.g. {{int:...} + # optional SFH_NO_HASH to omit the hash from calls (e.g. {{int:...}} # instead of {{#int:...}}) $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 ); @@ -67,7 +68,7 @@ class CoreParserFunctions { $parser->setFunctionHook( 'subjectpagename', array( __CLASS__, 'subjectpagename' ), SFH_NO_HASH ); $parser->setFunctionHook( 'subjectpagenamee', array( __CLASS__, 'subjectpagenamee' ), SFH_NO_HASH ); $parser->setFunctionHook( 'tag', array( __CLASS__, 'tagObj' ), SFH_OBJECT_ARGS ); - $parser->setFunctionHook( 'formatdate', array( __CLASS__, 'formatDate' ), SFH_NO_HASH ); + $parser->setFunctionHook( 'formatdate', array( __CLASS__, 'formatDate' ) ); if ( $wgAllowDisplayTitle ) { $parser->setFunctionHook( 'displaytitle', array( __CLASS__, 'displaytitle' ), SFH_NO_HASH ); @@ -88,20 +89,20 @@ class CoreParserFunctions { return array( 'found' => false ); } } - + static function formatDate( $parser, $date, $defaultPref = null ) { $df = DateFormatter::getInstance(); - - $date = trim($date); - + + $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 - if ($pref == 'default' && $defaultPref) + // iff the user has 'default' for their setting + if ( $pref == 'default' && $defaultPref ) $pref = $defaultPref; - - $date = $df->reformat( $pref, $date, array('match-whole') ); + + $date = $df->reformat( $pref, $date, array( 'match-whole' ) ); return $date; } @@ -119,8 +120,41 @@ class CoreParserFunctions { } } - static function urlencode( $parser, $s = '' ) { - return urlencode( $s ); + static function nse( $parser, $part1 = '' ) { + return wfUrlencode( str_replace( ' ', '_', self::ns( $parser, $part1 ) ) ); + } + + /** + * urlencodes a string according to one of three patterns: (bug 22474) + * + * By default (for HTTP "query" strings), spaces are encoded as '+'. + * Or to encode a value for the HTTP "path", spaces are encoded as '%20'. + * For links to "wiki"s, or similar software, spaces are encoded as '_', + * + * @param $parser Parser object + * @param $s String: The text to encode. + * @param $arg String (optional): The type of encoding. + */ + static function urlencode( $parser, $s = '', $arg = null ) { + static $magicWords = null; + if ( is_null( $magicWords ) ) { + $magicWords = new MagicWordArray( array( 'url_path', 'url_query', 'url_wiki' ) ); + } + switch( $magicWords->matchStartToEnd( $arg ) ) { + + // Encode as though it's a wiki page, '_' for ' '. + case 'url_wiki': + return wfUrlencode( str_replace( ' ', '_', $s ) ); + + // Encode for an HTTP Path, '%20' for ' '. + case 'url_path': + return rawurlencode( $s ); + + // Encode for HTTP query, '+' for ' '. + case 'url_query': + default: + return urlencode( $s ); + } } static function lcfirst( $parser, $s = '' ) { @@ -163,11 +197,11 @@ class CoreParserFunctions { # and the variable will fail. If we can't get a decent title from the first # attempt, url-decode and try for a second. if( is_null( $title ) ) - $title = Title::newFromUrl( urldecode( $s ) ); + $title = Title::newFromURL( urldecode( $s ) ); if( !is_null( $title ) ) { # Convert NS_MEDIA -> NS_FILE if( $title->getNamespace() == NS_MEDIA ) { - $title = Title::makeTitle( NS_FILE, $title->getDBKey() ); + $title = Title::makeTitle( NS_FILE, $title->getDBkey() ); } if( !is_null( $arg ) ) { $text = $title->$func( $arg ); @@ -193,15 +227,16 @@ 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) + + if ( is_object( $title ) && $title->getNamespace() == NS_USER ) $user = $title->getText(); // check parameter, or use $wgUser if in interface message @@ -212,10 +247,12 @@ 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); + static function plural( $parser, $text = '' ) { + $forms = array_slice( func_get_args(), 2 ); $text = $parser->getFunctionLang()->parseFormattedNumber( $text ); return $parser->getFunctionLang()->convertPlural( $text, $forms ); } @@ -224,21 +261,39 @@ class CoreParserFunctions { * Override the title of the page when viewed, provided we've been given a * title which will normalise to the canonical title * - * @param Parser $parser Parent parser - * @param string $text Desired title text - * @return string + * @param $parser Parser: parent parser + * @param $text String: desired title text + * @return String */ static function displaytitle( $parser, $text = '' ) { global $wgRestrictDisplayTitle; - $text = trim( Sanitizer::decodeCharReferences( $text ) ); - if ( !$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', '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 ) ); + + if( !$wgRestrictDisplayTitle ) { $parser->mOutput->setDisplayTitle( $text ); } else { - $title = Title::newFromText( $text ); - if( $title instanceof Title && $title->getFragment() == '' && $title->equals( $parser->mTitle ) ) + if ( $title instanceof Title && $title->getFragment() == '' && $title->equals( $parser->mTitle ) ) { $parser->mOutput->setDisplayTitle( $text ); + } } + return ''; } @@ -291,9 +346,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 @@ -302,37 +357,37 @@ class CoreParserFunctions { */ static function mwnamespace( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + if ( is_null( $t ) ) return ''; return str_replace( '_', ' ', $t->getNsText() ); } static function namespacee( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + if ( is_null( $t ) ) return ''; return wfUrlencode( $t->getNsText() ); } static function talkspace( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) || !$t->canTalk() ) + if ( is_null( $t ) || !$t->canTalk() ) return ''; return str_replace( '_', ' ', $t->getTalkNsText() ); } static function talkspacee( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) || !$t->canTalk() ) + if ( is_null( $t ) || !$t->canTalk() ) return ''; return wfUrlencode( $t->getTalkNsText() ); } static function subjectspace( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + if ( is_null( $t ) ) return ''; return str_replace( '_', ' ', $t->getSubjectNsText() ); } static function subjectspacee( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + if ( is_null( $t ) ) return ''; return wfUrlencode( $t->getSubjectNsText() ); } @@ -342,77 +397,77 @@ class CoreParserFunctions { */ static function pagename( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + if ( is_null( $t ) ) return ''; return wfEscapeWikiText( $t->getText() ); } static function pagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + if ( is_null( $t ) ) return ''; return $t->getPartialURL(); } static function fullpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) || !$t->canTalk() ) + if ( is_null( $t ) || !$t->canTalk() ) return ''; return wfEscapeWikiText( $t->getPrefixedText() ); } static function fullpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) || !$t->canTalk() ) + if ( is_null( $t ) || !$t->canTalk() ) return ''; return $t->getPrefixedURL(); } static function subpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + if ( is_null( $t ) ) return ''; return $t->getSubpageText(); } static function subpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + if ( is_null( $t ) ) return ''; return $t->getSubpageUrlForm(); } static function basepagename( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + if ( is_null( $t ) ) return ''; return $t->getBaseText(); } static function basepagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + 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() ) + if ( is_null( $t ) || !$t->canTalk() ) return ''; return wfEscapeWikiText( $t->getTalkPage()->getPrefixedText() ); } static function talkpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) || !$t->canTalk() ) + if ( is_null( $t ) || !$t->canTalk() ) return ''; return $t->getTalkPage()->getPrefixedUrl(); } static function subjectpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + if ( is_null( $t ) ) return ''; return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedText() ); } static function subjectpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); - if ( is_null($t) ) + if ( is_null( $t ) ) return ''; return $t->getSubjectPage()->getPrefixedUrl(); } - + /** * 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 @@ -443,16 +498,16 @@ class CoreParserFunctions { * Return the size of the given page, or 0 if it's nonexistent. This is an * expensive parser function and can't be called too many times per page. * - * @FIXME This doesn't work correctly on preview for getting the size of - * the current page. - * @FIXME Title::getLength() documentation claims that it adds things to - * the link cache, so the local cache here should be unnecessary, but in - * fact calling getLength() repeatedly for the same $page does seem to + * @todo Fixme: This doesn't work correctly on preview for getting the size + * of the current page. + * @todo Fixme: Title::getLength() documentation claims that it adds things + * to the link cache, so the local cache here should be unnecessary, but + * in fact calling getLength() repeatedly for the same $page does seem to * run one query for each call? */ static function pagesize( $parser, $page = '', $raw = null ) { static $cache = array(); - $title = Title::newFromText($page); + $title = Title::newFromText( $page ); if( !is_object( $title ) ) { $cache[$page] = 0; @@ -466,16 +521,16 @@ class CoreParserFunctions { if( isset( $cache[$page] ) ) { $length = $cache[$page]; } elseif( $parser->incrementExpensiveFunctionCount() ) { - $rev = Revision::newFromTitle($title); + $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 */ @@ -496,12 +551,12 @@ class CoreParserFunctions { * 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 ) { @@ -510,7 +565,7 @@ class CoreParserFunctions { $finalPadding .= mb_substr( $padding, 0, $length ); $length -= $lengthOfPadding; } - + if ( $direction == STR_PAD_LEFT ) { return $finalPadding . $string; } else { @@ -527,17 +582,14 @@ class CoreParserFunctions { } static function anchorencode( $parser, $text ) { - $a = urlencode( $text ); - $a = strtr( $a, array( '%' => '.', '+' => '_' ) ); - # leave colons alone, however - $a = str_replace( '.3A', ':', $a ); - return $a; + return substr( $parser->guessSectionNameFromWikiText( $text ), 1); } static function special( $parser, $text ) { - $title = SpecialPage::getTitleForAlias( $text ); - if ( $title ) { - return $title->getPrefixedText(); + list( $page, $subpage ) = SpecialPage::resolveAliasWithSubpage( $text ); + if ( $page ) { + $title = SpecialPage::getTitleFor( $page, $subpage ); + return $title; } else { return wfMsgForContent( 'nosuchspecialpage' ); }