/**
* @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 {
/**
* @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 '';
/**
* @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 );
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() );
}
$parser->getFunctionLang()
);
}
+
public static function numberingroup( $parser, $name = '', $raw = null ) {
return self::formatRaw(
SiteStats::numberingroup( strtolower( $name ) ),
}
return str_replace( '_', ' ', $t->getNsText() );
}
+
public static function namespacee( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return wfUrlencode( $t->getNsText() );
}
+
public static function namespacenumber( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return $t->getNamespace();
}
+
public static function talkspace( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
}
return str_replace( '_', ' ', $t->getTalkNsText() );
}
+
public static function talkspacee( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
}
return wfUrlencode( $t->getTalkNsText() );
}
+
public static function subjectspace( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return str_replace( '_', ' ', $t->getSubjectNsText() );
}
+
public static function subjectspacee( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return wfEscapeWikiText( $t->getText() );
}
+
public static function pagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return wfEscapeWikiText( $t->getPartialURL() );
}
+
public static function fullpagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
}
return wfEscapeWikiText( $t->getPrefixedText() );
}
+
public static function fullpagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
}
return wfEscapeWikiText( $t->getPrefixedURL() );
}
+
public static function subpagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return wfEscapeWikiText( $t->getSubpageText() );
}
+
public static function subpagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return wfEscapeWikiText( $t->getSubpageUrlForm() );
}
+
public static function rootpagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return wfEscapeWikiText( $t->getRootText() );
}
+
public static function rootpagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getRootText() ) ) );
}
+
public static function basepagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return wfEscapeWikiText( $t->getBaseText() );
}
+
public static function basepagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getBaseText() ) ) );
}
+
public static function talkpagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
}
return wfEscapeWikiText( $t->getTalkPage()->getPrefixedText() );
}
+
public static function talkpagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
}
return wfEscapeWikiText( $t->getTalkPage()->getPrefixedURL() );
}
+
public static function subjectpagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedText() );
}
+
public static function subjectpagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
if ( is_null( $t ) ) {
}
// 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
* @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] }}
*
* @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;
}
/**
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() : '';
}
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' ) : '';
}
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' ) : '';
}
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' ) : '';
}
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' ) : '';
}
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' ) : '';
}
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' ) : '';
}
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() : '';
}