aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--includes/parser/CoreMagicVariables.php74
-rw-r--r--includes/parser/Hook/ParserGetVariableValueTsHook.php6
-rw-r--r--includes/parser/Parser.php10
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