diff options
-rw-r--r-- | includes/parser/CoreMagicVariables.php | 74 | ||||
-rw-r--r-- | includes/parser/Hook/ParserGetVariableValueTsHook.php | 6 | ||||
-rw-r--r-- | includes/parser/Parser.php | 10 |
3 files changed, 55 insertions, 35 deletions
diff --git a/includes/parser/CoreMagicVariables.php b/includes/parser/CoreMagicVariables.php index 3a2571071f97..85ace21eb674 100644 --- a/includes/parser/CoreMagicVariables.php +++ b/includes/parser/CoreMagicVariables.php @@ -23,6 +23,7 @@ use MediaWiki\Config\ServiceOptions; use MediaWiki\Parser\ParserOutputFlags; use Psr\Log\LoggerInterface; +use Wikimedia\Timestamp\ConvertibleTimestamp; /** * Expansions of core magic variables, used by the parser. @@ -39,7 +40,7 @@ class CoreMagicVariables { * @param Parser $parser * @param string $id The name of the variable, and equivalently, the magic * word ID which was used to match the variable - * @param int $ts Timestamp to use when expanding magic variable + * @param ConvertibleTimestamp $ts Timestamp to use when expanding magic variable * @param NamespaceInfo $nsInfo The NamespaceInfo to use when expanding * @param ServiceOptions $svcOptions Service options for the parser * @param LoggerInterface $logger @@ -51,7 +52,7 @@ class CoreMagicVariables { Parser $parser, string $id, // Context passed over from the parser - int $ts, + ConvertibleTimestamp $ts, NamespaceInfo $nsInfo, ServiceOptions $svcOptions, LoggerInterface $logger @@ -63,33 +64,33 @@ class CoreMagicVariables { case '!': return '|'; case 'currentmonth': - return $pageLang->formatNumNoSeparators( MWTimestamp::getInstance( $ts )->format( 'm' ) ); + return $pageLang->formatNumNoSeparators( $ts->format( 'm' ) ); case 'currentmonth1': - return $pageLang->formatNumNoSeparators( MWTimestamp::getInstance( $ts )->format( 'n' ) ); + return $pageLang->formatNumNoSeparators( $ts->format( 'n' ) ); case 'currentmonthname': - return $pageLang->getMonthName( MWTimestamp::getInstance( $ts )->format( 'n' ) ); + return $pageLang->getMonthName( $ts->format( 'n' ) ); case 'currentmonthnamegen': - return $pageLang->getMonthNameGen( MWTimestamp::getInstance( $ts )->format( 'n' ) ); + return $pageLang->getMonthNameGen( $ts->format( 'n' ) ); case 'currentmonthabbrev': - return $pageLang->getMonthAbbreviation( MWTimestamp::getInstance( $ts )->format( 'n' ) ); + return $pageLang->getMonthAbbreviation( $ts->format( 'n' ) ); case 'currentday': - return $pageLang->formatNumNoSeparators( MWTimestamp::getInstance( $ts )->format( 'j' ) ); + return $pageLang->formatNumNoSeparators( $ts->format( 'j' ) ); case 'currentday2': - return $pageLang->formatNumNoSeparators( MWTimestamp::getInstance( $ts )->format( 'd' ) ); + return $pageLang->formatNumNoSeparators( $ts->format( 'd' ) ); case 'localmonth': - return $pageLang->formatNumNoSeparators( MWTimestamp::getLocalInstance( $ts )->format( 'm' ) ); + return $pageLang->formatNumNoSeparators( self::makeTsLocal( $svcOptions, $ts )->format( 'm' ) ); case 'localmonth1': - return $pageLang->formatNumNoSeparators( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) ); + return $pageLang->formatNumNoSeparators( self::makeTsLocal( $svcOptions, $ts )->format( 'n' ) ); case 'localmonthname': - return $pageLang->getMonthName( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) ); + return $pageLang->getMonthName( self::makeTsLocal( $svcOptions, $ts )->format( 'n' ) ); case 'localmonthnamegen': - return $pageLang->getMonthNameGen( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) ); + return $pageLang->getMonthNameGen( self::makeTsLocal( $svcOptions, $ts )->format( 'n' ) ); case 'localmonthabbrev': - return $pageLang->getMonthAbbreviation( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) ); + return $pageLang->getMonthAbbreviation( self::makeTsLocal( $svcOptions, $ts )->format( 'n' ) ); case 'localday': - return $pageLang->formatNumNoSeparators( MWTimestamp::getLocalInstance( $ts )->format( 'j' ) ); + return $pageLang->formatNumNoSeparators( self::makeTsLocal( $svcOptions, $ts )->format( 'j' ) ); case 'localday2': - return $pageLang->formatNumNoSeparators( MWTimestamp::getLocalInstance( $ts )->format( 'd' ) ); + return $pageLang->formatNumNoSeparators( self::makeTsLocal( $svcOptions, $ts )->format( 'd' ) ); case 'pagename': return wfEscapeWikiText( $title->getText() ); case 'pagenamee': @@ -240,39 +241,39 @@ class CoreMagicVariables { case 'subjectspacee': return ( wfUrlencode( $title->getSubjectNsText() ) ); case 'currentdayname': - return $pageLang->getWeekdayName( (int)MWTimestamp::getInstance( $ts )->format( 'w' ) + 1 ); + return $pageLang->getWeekdayName( (int)$ts->format( 'w' ) + 1 ); case 'currentyear': - return $pageLang->formatNumNoSeparators( MWTimestamp::getInstance( $ts )->format( 'Y' ) ); + return $pageLang->formatNumNoSeparators( $ts->format( 'Y' ) ); case 'currenttime': - return $pageLang->time( wfTimestamp( TS_MW, $ts ), false, false ); + return $pageLang->time( $ts->getTimestamp( TS_MW ), false, false ); case 'currenthour': - return $pageLang->formatNumNoSeparators( MWTimestamp::getInstance( $ts )->format( 'H' ) ); + return $pageLang->formatNumNoSeparators( $ts->format( 'H' ) ); case 'currentweek': // @bug T6594 PHP5 has it zero padded, PHP4 does not, cast to // int to remove the padding - return $pageLang->formatNum( (int)MWTimestamp::getInstance( $ts )->format( 'W' ) ); + return $pageLang->formatNum( (int)$ts->format( 'W' ) ); case 'currentdow': - return $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'w' ) ); + return $pageLang->formatNum( $ts->format( 'w' ) ); case 'localdayname': return $pageLang->getWeekdayName( - (int)MWTimestamp::getLocalInstance( $ts )->format( 'w' ) + 1 + (int)self::makeTsLocal( $svcOptions, $ts )->format( 'w' ) + 1 ); case 'localyear': - return $pageLang->formatNumNoSeparators( MWTimestamp::getLocalInstance( $ts )->format( 'Y' ) ); + return $pageLang->formatNumNoSeparators( self::makeTsLocal( $svcOptions, $ts )->format( 'Y' ) ); case 'localtime': return $pageLang->time( - MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' ), + self::makeTsLocal( $svcOptions, $ts )->format( 'YmdHis' ), false, false ); case 'localhour': - return $pageLang->formatNumNoSeparators( MWTimestamp::getLocalInstance( $ts )->format( 'H' ) ); + return $pageLang->formatNumNoSeparators( self::makeTsLocal( $svcOptions, $ts )->format( 'H' ) ); case 'localweek': // @bug T6594 PHP5 has it zero padded, PHP4 does not, cast to // int to remove the padding - return $pageLang->formatNum( (int)MWTimestamp::getLocalInstance( $ts )->format( 'W' ) ); + return $pageLang->formatNum( (int)self::makeTsLocal( $svcOptions, $ts )->format( 'W' ) ); case 'localdow': - return $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'w' ) ); + return $pageLang->formatNum( self::makeTsLocal( $svcOptions, $ts )->format( 'w' ) ); case 'numberofarticles': return $pageLang->formatNum( SiteStats::articles() ); case 'numberoffiles': @@ -288,9 +289,9 @@ class CoreMagicVariables { case 'numberofedits': return $pageLang->formatNum( SiteStats::edits() ); case 'currenttimestamp': - return wfTimestamp( TS_MW, $ts ); + return $ts->getTimestamp( TS_MW ); case 'localtimestamp': - return MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' ); + return self::makeTsLocal( $svcOptions, $ts )->format( 'YmdHis' ); case 'currentversion': return SpecialVersion::getVersion(); case 'articlepath': @@ -320,6 +321,19 @@ class CoreMagicVariables { } /** + * Helper to convert a timestamp instance to local time + * @see MWTimestamp::getLocalInstance() + * @param ServiceOptions $svcOptions Service options for the parser + * @param ConvertibleTimestamp $ts Timestamp to convert + * @return ConvertibleTimestamp + */ + private static function makeTsLocal( $svcOptions, $ts ) { + $localtimezone = $svcOptions->get( 'Localtimezone' ); + $ts->setTimezone( $localtimezone ); + return $ts; + } + + /** * @param Parser $parser * @param LoggerInterface $logger * @param int $start diff --git a/includes/parser/Hook/ParserGetVariableValueTsHook.php b/includes/parser/Hook/ParserGetVariableValueTsHook.php index e806be700ac8..6b769d31ff91 100644 --- a/includes/parser/Hook/ParserGetVariableValueTsHook.php +++ b/includes/parser/Hook/ParserGetVariableValueTsHook.php @@ -13,13 +13,13 @@ use Parser; */ interface ParserGetVariableValueTsHook { /** - * Use this hook to change the value of the time for the - * {{LOCAL...}} magic word. + * Use this hook to change the value of the time for time-related + * magic words, ie {{CURRENTMONTH}}, {{LOCALMONTH}}, etc. * * @since 1.35 * * @param Parser $parser - * @param string &$time Actual time (timestamp) + * @param string &$time Actual time (timestamp) in TS_UNIX format * @return bool|void True or no return value to continue or false to abort */ public function onParserGetVariableValueTs( $parser, &$time ); diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index 2942d9cb60bb..e8f7876445b8 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -406,12 +406,14 @@ class Parser { */ public const CONSTRUCTOR_OPTIONS = [ // See documentation for the corresponding config options + // Many of these are only used in (eg) CoreMagicVariables 'AllowDisplayTitle', 'AllowSlowParserFunctions', 'ArticlePath', 'EnableScaryTranscluding', 'ExtraInterlanguageLinkPrefixes', 'FragmentMode', + 'Localtimezone', 'MaxSigChars', 'MaxTocLevel', 'MiserMode', @@ -2815,8 +2817,12 @@ class Parser { return $this->mVarCache[$index]; } - $ts = wfTimestamp( TS_UNIX, $this->mOptions->getTimestamp() ); - $this->hookRunner->onParserGetVariableValueTs( $this, $ts ); + $ts = new MWTimestamp( $this->mOptions->getTimestamp() /* TS_MW */ ); + if ( $this->hookContainer->isRegistered( 'ParserGetVariableValueTs' ) ) { + $s = $ts->getTimestamp( TS_UNIX ); + $this->hookRunner->onParserGetVariableValueTs( $this, $s ); + $ts = new MWTimestamp( $s ); + } $value = CoreMagicVariables::expand( $this, $index, $ts, $this->nsInfo, $this->svcOptions, $this->logger |