* @ingroup Parser
*/
use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Linker\LinkRendererFactory;
use MediaWiki\MediaWikiServices;
use MediaWiki\Special\SpecialPageFactory;
use Wikimedia\ScopedCallback;
/** @var Config */
private $siteConfig;
+ /** @var LinkRendererFactory */
+ private $linkRendererFactory;
+
+ /** @var NamespaceInfo */
+ private $nsInfo;
+
/**
* @param array $parserConf See $wgParserConf documentation
* @param MagicWordFactory|null $magicWordFactory
* @param string|null $urlProtocols As returned from wfUrlProtocols()
* @param SpecialPageFactory|null $spFactory
* @param Config|null $siteConfig
+ * @param LinkRendererFactory|null $linkRendererFactory
+ * @param NamespaceInfo|null $nsInfo
*/
public function __construct(
array $parserConf = [], MagicWordFactory $magicWordFactory = null,
Language $contLang = null, ParserFactory $factory = null, $urlProtocols = null,
- SpecialPageFactory $spFactory = null, Config $siteConfig = null
+ SpecialPageFactory $spFactory = null, Config $siteConfig = null,
+ LinkRendererFactory $linkRendererFactory = null,
+ NamespaceInfo $nsInfo = null
) {
$this->mConf = $parserConf;
$this->mUrlProtocols = $urlProtocols ?? wfUrlProtocols();
$this->factory = $factory ?? $services->getParserFactory();
$this->specialPageFactory = $spFactory ?? $services->getSpecialPageFactory();
- $this->siteConfig = $siteConfig ?? MediaWikiServices::getInstance()->getMainConfig();
+ $this->siteConfig = $siteConfig ?? $services->getMainConfig();
+ $this->linkRendererFactory =
+ $linkRendererFactory ?? $services->getLinkRendererFactory();
+ $this->nsInfo = $nsInfo ?? $services->getNamespaceInfo();
}
/**
* @return LinkRenderer
*/
public function getLinkRenderer() {
+ // XXX We make the LinkRenderer with current options and then cache it forever
if ( !$this->mLinkRenderer ) {
- $this->mLinkRenderer = MediaWikiServices::getInstance()
- ->getLinkRendererFactory()->create();
+ $this->mLinkRenderer = $this->linkRendererFactory->create();
$this->mLinkRenderer->setStubThreshold(
$this->getOptions()->getStubThreshold()
);
*/
if ( !( $this->mOptions->getDisableContentConversion()
|| isset( $this->mDoubleUnderscores['nocontentconvert'] ) )
+ && !$this->mOptions->getInterfaceMessage()
) {
- if ( !$this->mOptions->getInterfaceMessage() ) {
- # The position of the convert() call should not be changed. it
- # assumes that the links are all replaced and the only thing left
- # is the <nowiki> mark.
- $text = $this->getTargetLanguage()->convert( $text );
- }
+ # The position of the convert() call should not be changed. it
+ # assumes that the links are all replaced and the only thing left
+ # is the <nowiki> mark.
+ $text = $this->getTargetLanguage()->convert( $text );
}
$text = $this->mStripState->unstripNoWiki( $text );
// if $firstsingleletterword is set, we don't
// look at the other options, so we can bail early.
break;
- } else {
- if ( $firstmultiletterword == -1 ) {
- $firstmultiletterword = $i;
- }
+ } elseif ( $firstmultiletterword == -1 ) {
+ $firstmultiletterword = $i;
}
}
}
*/
public function areSubpagesAllowed() {
# Some namespaces don't allow subpages
- return MWNamespace::hasSubpages( $this->mTitle->getNamespace() );
+ return $this->nsInfo->hasSubpages( $this->mTitle->getNamespace() );
}
/**
* Some of these require message or data lookups and can be
* expensive to check many times.
*/
- if ( Hooks::run( 'ParserGetVariableValueVarCache', [ &$parser, &$this->mVarCache ] ) ) {
- if ( isset( $this->mVarCache[$index] ) ) {
- return $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 ) {
);
}
}
- } elseif ( MWNamespace::isNonincludable( $title->getNamespace() ) ) {
+ } elseif ( $this->nsInfo->isNonincludable( $title->getNamespace() ) ) {
$found = false; # access denied
wfDebug( __METHOD__ . ": template inclusion denied for " .
$title->getPrefixedDBkey() . "\n" );
* 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
if ( $paramName === 'no-link' ) {
$value = true;
}
- if ( $paramName === 'link-url' ) {
- if ( $this->mOptions->getExternalLinkTarget() ) {
- $params[$type]['link-target'] = $this->mOptions->getExternalLinkTarget();
- }
+ if ( ( $paramName === 'link-url' ) && $this->mOptions->getExternalLinkTarget() ) {
+ $params[$type]['link-target'] = $this->mOptions->getExternalLinkTarget();
}
}
break;
if ( $sectionIndex == 0 ) {
if ( $mode === 'get' ) {
return '';
- } else {
- return $newText;
}
+
+ return $newText;
} else {
if ( $mode === 'get' ) {
return $newText;
- } else {
- return $text;
}
+
+ return $text;
}
}
*/
public static function stripOuterParagraph( $html ) {
$m = [];
- if ( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $html, $m ) ) {
- if ( strpos( $m[1], '</p>' ) === false ) {
- $html = $m[1];
- }
+ if ( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $html, $m ) && strpos( $m[1], '</p>' ) === false ) {
+ $html = $m[1];
}
return $html;
/**
* 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