*/
use MediaWiki\Linker\LinkRenderer;
use MediaWiki\Linker\LinkRendererFactory;
+use MediaWiki\Linker\LinkTarget;
use MediaWiki\MediaWikiServices;
use MediaWiki\Special\SpecialPageFactory;
use Wikimedia\ScopedCallback;
* @since 1.21
* @param string|bool $url Optional URL, to extract the domain from for rel =>
* nofollow if appropriate
- * @param Title|null $title Optional Title, for wgNoFollowNsExceptions lookups
+ * @param LinkTarget|null $title Optional LinkTarget, for wgNoFollowNsExceptions lookups
* @return string|null Rel attribute for $url
*/
public static function getExternalLinkRel( $url = false, $title = null ) {
* Some of these require message or data lookups and can be
* expensive to check many times.
*/
- if ( Hooks::run( 'ParserGetVariableValueVarCache', [ &$parser, &$this->mVarCache ] )
- && isset( $this->mVarCache[$index] )
+ if (
+ Hooks::run( 'ParserGetVariableValueVarCache', [ &$parser, &$this->mVarCache ] ) &&
+ isset( $this->mVarCache[$index] )
) {
return $this->mVarCache[$index];
}
$ts = wfTimestamp( TS_UNIX, $this->mOptions->getTimestamp() );
Hooks::run( 'ParserGetVariableValueTs', [ &$parser, &$ts ] );
- // In miser mode, disable words that always cause double-parses on page save (T137900)
- static $slowRevWords = [ 'revisionid' => true ]; // @TODO: 'revisiontimestamp'
- if (
- isset( $slowRevWords[$index] ) &&
- $this->siteConfig->get( 'MiserMode' ) &&
- !$this->mOptions->getInterfaceMessage() &&
- // @TODO: disallow this word on all namespaces
- $this->nsInfo->isContent( $this->mTitle->getNamespace() )
- ) {
- if ( $this->mRevisionId || $this->mOptions->getSpeculativeRevId() ) {
- return '-';
- } else {
- $this->mOutput->setFlag( 'vary-revision-exists' );
-
- return '';
- }
- };
-
$pageLang = $this->getFunctionLang();
switch ( $index ) {
$value = $pageid ?: null;
break;
case 'revisionid':
- # Let the edit saving system know we should parse the page
- # *after* a revision ID has been assigned.
- $this->mOutput->setFlag( 'vary-revision-id' );
- wfDebug( __METHOD__ . ": {{REVISIONID}} used, setting vary-revision-id...\n" );
- $value = $this->mRevisionId;
-
- if ( !$value ) {
- $rev = $this->getRevisionObject();
- if ( $rev ) {
- $value = $rev->getId();
+ if (
+ $this->siteConfig->get( 'MiserMode' ) &&
+ !$this->mOptions->getInterfaceMessage() &&
+ // @TODO: disallow this word on all namespaces
+ $this->nsInfo->isContent( $this->mTitle->getNamespace() )
+ ) {
+ // Use a stub result instead of the actual revision ID in order to avoid
+ // double parses on page save but still allow preview detection (T137900)
+ if ( $this->getRevisionId() || $this->mOptions->getSpeculativeRevId() ) {
+ $value = '-';
+ } else {
+ $this->mOutput->setFlag( 'vary-revision-exists' );
+ $value = '';
}
- }
-
- if ( !$value ) {
- $value = $this->mOptions->getSpeculativeRevId();
- if ( $value ) {
- $this->mOutput->setSpeculativeRevIdUsed( $value );
+ } else {
+ # Inform the edit saving system that getting the canonical output after
+ # revision insertion requires another parse using the actual revision ID
+ $this->mOutput->setFlag( 'vary-revision-id' );
+ wfDebug( __METHOD__ . ": {{REVISIONID}} used, setting vary-revision-id...\n" );
+ $value = $this->getRevisionId();
+ if ( $value === 0 ) {
+ $rev = $this->getRevisionObject();
+ $value = $rev ? $rev->getId() : $value;
+ }
+ if ( !$value ) {
+ $value = $this->mOptions->getSpeculativeRevId();
+ if ( $value ) {
+ $this->mOutput->setSpeculativeRevIdUsed( $value );
+ }
}
}
break;
* If you have pre-fetched the nickname or the fancySig option, you can
* specify them here to save a database query.
* Do not reuse this parser instance after calling getUserSig(),
- * as it may have changed if it's the $wgParser.
+ * as it may have changed.
*
* @param User &$user
* @param string|bool $nickname Nickname to use or false to use user's default nickname
/**
* Get the ID of the revision we are parsing
*
+ * The return value will be either:
+ * - a) Positive, indicating a specific revision ID (current or old)
+ * - b) Zero, meaning the revision ID specified by getCurrentRevisionCallback()
+ * - c) Null, meaning the parse is for preview mode and there is no revision
+ *
* @return int|null
*/
public function getRevisionId() {
/**
* Return this parser if it is not doing anything, otherwise
* get a fresh parser. You can use this method by doing
- * $myParser = $wgParser->getFreshParser(), or more simply
- * $wgParser->getFreshParser()->parse( ... );
- * if you're unsure if $wgParser is safe to use.
+ * $newParser = $oldParser->getFreshParser(), or more simply
+ * $oldParser->getFreshParser()->parse( ... );
+ * if you're unsure if $oldParser is safe to use.
*
* @since 1.24
* @return Parser A parser object that is not parsing anything