Merge "Delete autoload.ide.php"
[lhc/web/wiklou.git] / includes / parser / Parser.php
index 92cbcbc..96bf892 100644 (file)
@@ -51,9 +51,6 @@ use Wikimedia\ScopedCallback;
  * - Parser::getPreloadText()
  *     removes <noinclude> sections and <includeonly> 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
                        );
@@ -2881,8 +2901,8 @@ class Parser {
                $variableIDs = $this->magicWordFactory->getVariableIDs();
                $substIDs = $this->magicWordFactory->getSubstIDs();
 
-               $this->mVariables = new MagicWordArray( $variableIDs );
-               $this->mSubstWords = new MagicWordArray( $substIDs );
+               $this->mVariables = $this->magicWordFactory->newArray( $variableIDs );
+               $this->mSubstWords = $this->magicWordFactory->newArray( $substIDs );
        }
 
        /**
@@ -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 ) ) {
@@ -5066,7 +5078,7 @@ class Parser {
                                unset( $paramMap['img_width'] );
                        }
 
-                       $mwArray = new MagicWordArray( array_keys( $paramMap ) );
+                       $mwArray = $this->magicWordFactory->newArray( array_keys( $paramMap ) );
 
                        $label = '';
                        $alt = '';
@@ -5185,7 +5197,8 @@ class Parser {
                                }
                        }
                        $this->mImageParams[$handlerClass] = $paramMap;
-                       $this->mImageParamsMagicArray[$handlerClass] = new MagicWordArray( array_keys( $paramMap ) );
+                       $this->mImageParamsMagicArray[$handlerClass] =
+                               $this->magicWordFactory->newArray( array_keys( $paramMap ) );
                }
                return [ $this->mImageParams[$handlerClass], $this->mImageParamsMagicArray[$handlerClass] ];
        }
@@ -5728,8 +5741,6 @@ class Parser {
         */
        public function getRevisionTimestamp() {
                if ( is_null( $this->mRevisionTimestamp ) ) {
-                       global $wgContLang;
-
                        $revObject = $this->getRevisionObject();
                        $timestamp = $revObject ? $revObject->getTimestamp() : wfTimestampNow();
 
@@ -5738,8 +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;
        }
@@ -6194,9 +6204,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;
                }