X-Git-Url: https://git.cyclocoop.org/admin/?a=blobdiff_plain;f=includes%2Fparser%2FParser.php;h=7599a1f1cf19b9543ab86d38ac8a5d6ee891ec73;hb=bca608592079a5f8697ad35ad3188b62b73859d9;hp=2778ea69651b1246b9d22c7a34a24512e7c42742;hpb=b5f98e9402441bc98bf8f807b05bec873566548c;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index 2778ea6965..7599a1f1cf 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -51,9 +51,6 @@ use Wikimedia\ScopedCallback; * - Parser::getPreloadText() * removes sections and tags * - * Globals used: - * object: $wgContLang - * * @warning $wgUser or $wgTitle or $wgRequest or $wgLang. Keep them away! * * @par Settings: @@ -153,6 +150,9 @@ class Parser { public $mImageParams = []; public $mImageParamsMagicArray = []; public $mMarkerIndex = 0; + /** + * @var bool Whether firstCallInit still needs to be called + */ public $mFirstCall = true; # Initialised by initialiseVariables() @@ -263,13 +263,25 @@ class Parser { /** @var MagicWordFactory */ private $magicWordFactory; + /** @var Language */ + private $contLang; + + /** @var ParserFactory */ + private $factory; + /** - * @param array $conf + * @param array $conf See $wgParserConf documentation * @param MagicWordFactory|null $magicWordFactory + * @param Language|null $contLang Content language + * @param ParserFactory|null $factory + * @param string|null $urlProtocols As returned from wfUrlProtocols() */ - public function __construct( $conf = [], MagicWordFactory $magicWordFactory = null ) { + public function __construct( + array $conf = [], MagicWordFactory $magicWordFactory = null, Language $contLang = null, + ParserFactory $factory = null, $urlProtocols = null + ) { $this->mConf = $conf; - $this->mUrlProtocols = wfUrlProtocols(); + $this->mUrlProtocols = $urlProtocols ?? wfUrlProtocols(); $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')' . self::EXT_LINK_ADDR . self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F\\x{FFFD}]*?)\]/Su'; @@ -289,10 +301,12 @@ class Parser { } wfDebug( __CLASS__ . ": using preprocessor: {$this->mPreprocessorClass}\n" ); - $this->magicWordFactory = $magicWordFactory; - if ( !$magicWordFactory ) { - $this->magicWordFactory = MediaWikiServices::getInstance()->getMagicWordFactory(); - } + $this->magicWordFactory = $magicWordFactory ?? + MediaWikiServices::getInstance()->getMagicWordFactory(); + + $this->contLang = $contLang ?? MediaWikiServices::getInstance()->getContentLanguage(); + + $this->factory = $factory ?? MediaWikiServices::getInstance()->getParserFactory(); } /** @@ -354,9 +368,7 @@ class Parser { * @private */ public function clearState() { - if ( $this->mFirstCall ) { - $this->firstCallInit(); - } + $this->firstCallInit(); $this->mOutput = new ParserOutput; $this->mOptions->registerWatcher( [ $this->mOutput, 'recordOption' ] ); $this->mAutonumber = 0; @@ -967,6 +979,16 @@ class Parser { return $this->magicWordFactory; } + /** + * Get the content language that this Parser is using + * + * @since 1.32 + * @return Language + */ + public function getContentLanguage() { + return $this->contLang; + } + /** * Replaces all occurrences of HTML-style comments and the given tags * in the text with a random marker and returns the next text. The output @@ -2146,8 +2168,7 @@ class Parser { if ( $useLinkPrefixExtension ) { # Match the end of a line for a word that's not followed by whitespace, # e.g. in the case of 'The Arab al[[Razi]]', 'al' will be matched - global $wgContLang; - $charset = $wgContLang->linkPrefixCharset(); + $charset = $this->contLang->linkPrefixCharset(); $e2 = "/^((?>.*[^$charset]|))(.+)$/sDu"; } @@ -2508,7 +2529,7 @@ class Parser { * @return string */ public function getVariableValue( $index, $frame = false ) { - global $wgContLang, $wgSitename, $wgServer, $wgServerName; + global $wgSitename, $wgServer, $wgServerName; global $wgArticlePath, $wgScriptPath, $wgStylePath; if ( is_null( $this->mTitle ) ) { @@ -2702,10 +2723,11 @@ class Parser { $value = $this->getRevisionSize(); break; case 'namespace': - $value = str_replace( '_', ' ', $wgContLang->getNsText( $this->mTitle->getNamespace() ) ); + $value = str_replace( '_', ' ', + $this->contLang->getNsText( $this->mTitle->getNamespace() ) ); break; case 'namespacee': - $value = wfUrlencode( $wgContLang->getNsText( $this->mTitle->getNamespace() ) ); + $value = wfUrlencode( $this->contLang->getNsText( $this->mTitle->getNamespace() ) ); break; case 'namespacenumber': $value = $this->mTitle->getNamespace(); @@ -2848,15 +2870,13 @@ class Parser { * @return string */ private function getRevisionTimestampSubstring( $start, $len, $mtts, $variable ) { - global $wgContLang; - # Get the timezone-adjusted timestamp to be used for this revision $resNow = substr( $this->getRevisionTimestamp(), $start, $len ); # Possibly set vary-revision if there is not yet an associated revision if ( !$this->getRevisionObject() ) { # Get the timezone-adjusted timestamp $mtts seconds in the future $resThen = substr( - $wgContLang->userAdjust( wfTimestamp( TS_MW, time() + $mtts ), '' ), + $this->contLang->userAdjust( wfTimestamp( TS_MW, time() + $mtts ), '' ), $start, $len ); @@ -3403,14 +3423,12 @@ class Parser { * @return array */ public function callParserFunction( $frame, $function, array $args = [] ) { - global $wgContLang; - # Case sensitive functions if ( isset( $this->mFunctionSynonyms[1][$function] ) ) { $function = $this->mFunctionSynonyms[1][$function]; } else { # Case insensitive functions - $function = $wgContLang->lc( $function ); + $function = $this->contLang->lc( $function ); if ( isset( $this->mFunctionSynonyms[0][$function] ) ) { $function = $this->mFunctionSynonyms[0][$function]; } else { @@ -3675,8 +3693,8 @@ class Parser { break; } } elseif ( $title->getNamespace() == NS_MEDIAWIKI ) { - global $wgContLang; - $message = wfMessage( $wgContLang->lcfirst( $title->getText() ) )->inContentLanguage(); + $message = wfMessage( MediaWikiServices::getInstance()->getContentLanguage()-> + lcfirst( $title->getText() ) )->inContentLanguage(); if ( !$message->exists() ) { $text = false; break; @@ -4513,19 +4531,15 @@ class Parser { * @return string */ private function pstPass2( $text, $user ) { - global $wgContLang; - - # Note: This is the timestamp saved as hardcoded wikitext to - # the database, we use $wgContLang here in order to give - # everyone the same signature and use the default one rather - # than the one selected in each user's preferences. - # (see also T14815) + # Note: This is the timestamp saved as hardcoded wikitext to the database, we use + # $this->contLang here in order to give everyone the same signature and use the default one + # rather than the one selected in each user's preferences. (see also T14815) $ts = $this->mOptions->getTimestamp(); $timestamp = MWTimestamp::getLocalInstance( $ts ); $ts = $timestamp->format( 'YmdHis' ); $tzMsg = $timestamp->getTimezoneMessage()->inContentLanguage()->text(); - $d = $wgContLang->timeanddate( $ts, false, false ) . " ($tzMsg)"; + $d = $this->contLang->timeanddate( $ts, false, false ) . " ($tzMsg)"; # Variable replacement # Because mOutputType is OT_WIKI, this will only process {{subst:xxx}} type tags @@ -4876,8 +4890,6 @@ class Parser { * @return string|callable The old callback function for this name, if any */ public function setFunctionHook( $id, callable $callback, $flags = 0 ) { - global $wgContLang; - $oldVal = isset( $this->mFunctionHooks[$id] ) ? $this->mFunctionHooks[$id][0] : null; $this->mFunctionHooks[$id] = [ $callback, $flags ]; @@ -4893,7 +4905,7 @@ class Parser { foreach ( $synonyms as $syn ) { # Case if ( !$sensitive ) { - $syn = $wgContLang->lc( $syn ); + $syn = $this->contLang->lc( $syn ); } # Add leading hash if ( !( $flags & self::SFH_NO_HASH ) ) { @@ -5729,8 +5741,6 @@ class Parser { */ public function getRevisionTimestamp() { if ( is_null( $this->mRevisionTimestamp ) ) { - global $wgContLang; - $revObject = $this->getRevisionObject(); $timestamp = $revObject ? $revObject->getTimestamp() : wfTimestampNow(); @@ -5739,7 +5749,7 @@ class Parser { # Since this value will be saved into the parser cache, served # to other users, and potentially even used inside links and such, # it needs to be consistent for all visitors. - $this->mRevisionTimestamp = $wgContLang->userAdjust( $timestamp, '' ); + $this->mRevisionTimestamp = $this->contLang->userAdjust( $timestamp, '' ); } return $this->mRevisionTimestamp; @@ -6195,9 +6205,8 @@ class Parser { * @return Parser A parser object that is not parsing anything */ public function getFreshParser() { - global $wgParserConf; if ( $this->mInParse ) { - return new $wgParserConf['class']( $wgParserConf ); + return $this->factory->create(); } else { return $this; }