X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fparser%2FCoreParserFunctions.php;h=5aa1a691b0c1f09a3d936a0c7d0bacb3d2040470;hb=3e74b6eeaaf4ad0ce1217d013cca09a3f07cb5c7;hp=b2b74869184912d07c1d3e169bfd69195f5fdae2;hpb=1f163231a6eb5d3e11f55d3d65b5acb45a4d80f8;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php index b2b7486918..5aa1a691b0 100644 --- a/includes/parser/CoreParserFunctions.php +++ b/includes/parser/CoreParserFunctions.php @@ -90,13 +90,13 @@ class CoreParserFunctions { /** * @param Parser $parser - * @param string $part1 + * @param string $part1 Message key + * @param mixed ...$params To pass to wfMessage() * @return array */ - public static function intFunction( $parser, $part1 = '' /*, ... */ ) { + public static function intFunction( $parser, $part1 = '', ...$params ) { if ( strval( $part1 ) !== '' ) { - $args = array_slice( func_get_args(), 2 ); - $message = wfMessage( $part1, $args ) + $message = wfMessage( $part1, $params ) ->inLanguage( $parser->getOptions()->getUserLangObj() ); return [ $message->plain(), 'noparse' => false ]; } else { @@ -313,11 +313,10 @@ class CoreParserFunctions { /** * @param Parser $parser * @param string $username + * @param string ...$forms What to output for each gender * @return string */ - public static function gender( $parser, $username ) { - $forms = array_slice( func_get_args(), 2 ); - + public static function gender( $parser, $username, ...$forms ) { // Some shortcuts to avoid loading user data unnecessarily if ( count( $forms ) === 0 ) { return ''; @@ -351,10 +350,10 @@ class CoreParserFunctions { /** * @param Parser $parser * @param string $text + * @param string ...$forms What to output for each number (singular, dual, plural, etc.) * @return string */ - public static function plural( $parser, $text = '' ) { - $forms = array_slice( func_get_args(), 2 ); + public static function plural( $parser, $text = '', ...$forms ) { $text = $parser->getFunctionLang()->parseFormattedNumber( $text ); settype( $text, ctype_digit( $text ) ? 'int' : 'float' ); return $parser->getFunctionLang()->convertPlural( $text, $forms ); @@ -515,6 +514,7 @@ class CoreParserFunctions { public static function numberofusers( $parser, $raw = null ) { return self::formatRaw( SiteStats::users(), $raw, $parser->getFunctionLang() ); } + public static function numberofactiveusers( $parser, $raw = null ) { return self::formatRaw( SiteStats::activeUsers(), $raw, $parser->getFunctionLang() ); } @@ -546,6 +546,7 @@ class CoreParserFunctions { $parser->getFunctionLang() ); } + public static function numberingroup( $parser, $name = '', $raw = null ) { return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), @@ -570,6 +571,7 @@ class CoreParserFunctions { } return str_replace( '_', ' ', $t->getNsText() ); } + public static function namespacee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -577,6 +579,7 @@ class CoreParserFunctions { } return wfUrlencode( $t->getNsText() ); } + public static function namespacenumber( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -584,6 +587,7 @@ class CoreParserFunctions { } return $t->getNamespace(); } + public static function talkspace( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canHaveTalkPage() ) { @@ -591,6 +595,7 @@ class CoreParserFunctions { } return str_replace( '_', ' ', $t->getTalkNsText() ); } + public static function talkspacee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canHaveTalkPage() ) { @@ -598,6 +603,7 @@ class CoreParserFunctions { } return wfUrlencode( $t->getTalkNsText() ); } + public static function subjectspace( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -605,6 +611,7 @@ class CoreParserFunctions { } return str_replace( '_', ' ', $t->getSubjectNsText() ); } + public static function subjectspacee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -627,6 +634,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( $t->getText() ); } + public static function pagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -634,6 +642,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( $t->getPartialURL() ); } + public static function fullpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canHaveTalkPage() ) { @@ -641,6 +650,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( $t->getPrefixedText() ); } + public static function fullpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canHaveTalkPage() ) { @@ -648,6 +658,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( $t->getPrefixedURL() ); } + public static function subpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -655,6 +666,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( $t->getSubpageText() ); } + public static function subpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -662,6 +674,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( $t->getSubpageUrlForm() ); } + public static function rootpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -669,6 +682,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( $t->getRootText() ); } + public static function rootpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -676,6 +690,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getRootText() ) ) ); } + public static function basepagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -683,6 +698,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( $t->getBaseText() ); } + public static function basepagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -690,6 +706,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getBaseText() ) ) ); } + public static function talkpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canHaveTalkPage() ) { @@ -697,6 +714,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( $t->getTalkPage()->getPrefixedText() ); } + public static function talkpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) || !$t->canHaveTalkPage() ) { @@ -704,6 +722,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( $t->getTalkPage()->getPrefixedURL() ); } + public static function subjectpagename( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -711,6 +730,7 @@ class CoreParserFunctions { } return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedText() ); } + public static function subjectpagenamee( $parser, $title = null ) { $t = Title::newFromText( $title ); if ( is_null( $t ) ) { @@ -803,7 +823,7 @@ class CoreParserFunctions { } // fetch revision from cache/database and return the value - $rev = self::getCachedRevisionObject( $parser, $title ); + $rev = self::getCachedRevisionObject( $parser, $title, 'vary-revision-sha1' ); $length = $rev ? $rev->getSize() : 0; if ( $length === null ) { // We've had bugs where rev_len was not being recorded for empty pages, see T135414 @@ -1010,7 +1030,7 @@ class CoreParserFunctions { * @return array|string */ public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) { - $file = wfFindFile( $name ); + $file = MediaWikiServices::getInstance()->getRepoGroup()->findFile( $name ); if ( $argA == 'nowiki' ) { // {{filepath: | option [| size] }} @@ -1106,41 +1126,56 @@ class CoreParserFunctions { * * @param Parser $parser * @param Title $title + * @param string $vary ParserOuput vary-* flag * @return Revision * @since 1.23 */ - private static function getCachedRevisionObject( $parser, $title = null ) { - if ( is_null( $title ) ) { + private static function getCachedRevisionObject( $parser, $title, $vary ) { + if ( !$title ) { return null; } - // Use the revision from the parser itself, when param is the current page - // and the revision is the current one - if ( $title->equals( $parser->getTitle() ) ) { - $parserRev = $parser->getRevisionObject(); - if ( $parserRev && $parserRev->isCurrent() ) { - // force reparse after edit with vary-revision flag - $parser->getOutput()->setFlag( 'vary-revision' ); - wfDebug( __METHOD__ . ": use current revision from parser, setting vary-revision...\n" ); - return $parserRev; + $revision = null; + + $isSelfReferential = $title->equals( $parser->getTitle() ); + if ( $isSelfReferential ) { + // Revision is for the same title that is currently being parsed. Only use the last + // saved revision, regardless of Parser::getRevisionId() or fake revision injection + // callbacks against the current title. + $parserRevision = $parser->getRevisionObject(); + if ( $parserRevision && $parserRevision->isCurrent() ) { + $revision = $parserRevision; + wfDebug( __METHOD__ . ": used current revision, setting $vary" ); } } - // Normalize name for cache - $page = $title->getPrefixedDBkey(); - - if ( !( $parser->currentRevisionCache && $parser->currentRevisionCache->has( $page ) ) - && !$parser->incrementExpensiveFunctionCount() ) { - return null; + $parserOutput = $parser->getOutput(); + if ( !$revision ) { + if ( + !$parser->isCurrentRevisionOfTitleCached( $title ) && + !$parser->incrementExpensiveFunctionCount() + ) { + return null; // not allowed + } + // Get the current revision, ignoring Parser::getRevisionId() being null/old + $revision = $parser->fetchCurrentRevisionOfTitle( $title ); + // Register dependency in templatelinks + $parserOutput->addTemplate( + $title, + $revision ? $revision->getPage() : 0, + $revision ? $revision->getId() : 0 + ); } - $rev = $parser->fetchCurrentRevisionOfTitle( $title ); - $pageID = $rev ? $rev->getPage() : 0; - $revID = $rev ? $rev->getId() : 0; - // Register dependency in templatelinks - $parser->getOutput()->addTemplate( $title, $pageID, $revID ); + if ( $isSelfReferential ) { + // Upon page save, the result of the parser function using this might change + $parserOutput->setFlag( $vary ); + if ( $vary === 'vary-revision-sha1' && $revision ) { + $parserOutput->setRevisionUsedSha1Base36( $revision->getSha1() ); + } + } - return $rev; + return $revision; } /** @@ -1201,7 +1236,7 @@ class CoreParserFunctions { return ''; } // fetch revision from cache/database and return the value - $rev = self::getCachedRevisionObject( $parser, $t ); + $rev = self::getCachedRevisionObject( $parser, $t, 'vary-revision-id' ); return $rev ? $rev->getId() : ''; } @@ -1218,7 +1253,7 @@ class CoreParserFunctions { return ''; } // fetch revision from cache/database and return the value - $rev = self::getCachedRevisionObject( $parser, $t ); + $rev = self::getCachedRevisionObject( $parser, $t, 'vary-revision-timestamp' ); return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'j' ) : ''; } @@ -1235,7 +1270,7 @@ class CoreParserFunctions { return ''; } // fetch revision from cache/database and return the value - $rev = self::getCachedRevisionObject( $parser, $t ); + $rev = self::getCachedRevisionObject( $parser, $t, 'vary-revision-timestamp' ); return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'd' ) : ''; } @@ -1252,7 +1287,7 @@ class CoreParserFunctions { return ''; } // fetch revision from cache/database and return the value - $rev = self::getCachedRevisionObject( $parser, $t ); + $rev = self::getCachedRevisionObject( $parser, $t, 'vary-revision-timestamp' ); return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'm' ) : ''; } @@ -1269,7 +1304,7 @@ class CoreParserFunctions { return ''; } // fetch revision from cache/database and return the value - $rev = self::getCachedRevisionObject( $parser, $t ); + $rev = self::getCachedRevisionObject( $parser, $t, 'vary-revision-timestamp' ); return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'n' ) : ''; } @@ -1286,7 +1321,7 @@ class CoreParserFunctions { return ''; } // fetch revision from cache/database and return the value - $rev = self::getCachedRevisionObject( $parser, $t ); + $rev = self::getCachedRevisionObject( $parser, $t, 'vary-revision-timestamp' ); return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'Y' ) : ''; } @@ -1303,7 +1338,7 @@ class CoreParserFunctions { return ''; } // fetch revision from cache/database and return the value - $rev = self::getCachedRevisionObject( $parser, $t ); + $rev = self::getCachedRevisionObject( $parser, $t, 'vary-revision-timestamp' ); return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'YmdHis' ) : ''; } @@ -1320,7 +1355,7 @@ class CoreParserFunctions { return ''; } // fetch revision from cache/database and return the value - $rev = self::getCachedRevisionObject( $parser, $t ); + $rev = self::getCachedRevisionObject( $parser, $t, 'vary-user' ); return $rev ? $rev->getUserText() : ''; }