X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fparser%2FParser.php;h=dfd9602de3a554b0e7efefa5171e5ee9a65a90eb;hp=b66031cc8804169f36aed386e585006a781ded2e;hb=5952d843079cbfc22b64e0b0266fe223d0929399;hpb=4660ce079ca78a66e4ec7386481868a52ecebda5 diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index b66031cc88..dfd9602de3 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -138,6 +138,9 @@ class Parser { const TOC_START = ''; const TOC_END = ''; + /** @var int Assume that no output will later be saved this many seconds after parsing */ + const MAX_TTS = 900; + # Persistent: public $mTagHooks = []; public $mTransparentTagHooks = []; @@ -2652,39 +2655,19 @@ class Parser { } break; case 'revisionday': - # Let the edit saving system know we should parse the page - # *after* a revision ID has been assigned. This is for null edits. - $this->mOutput->setFlag( 'vary-revision' ); - wfDebug( __METHOD__ . ": {{REVISIONDAY}} used, setting vary-revision...\n" ); - $value = intval( substr( $this->getRevisionTimestamp(), 6, 2 ) ); + $value = (int)$this->getRevisionTimestampSubstring( 6, 2, self::MAX_TTS, $index ); break; case 'revisionday2': - # Let the edit saving system know we should parse the page - # *after* a revision ID has been assigned. This is for null edits. - $this->mOutput->setFlag( 'vary-revision' ); - wfDebug( __METHOD__ . ": {{REVISIONDAY2}} used, setting vary-revision...\n" ); - $value = substr( $this->getRevisionTimestamp(), 6, 2 ); + $value = $this->getRevisionTimestampSubstring( 6, 2, self::MAX_TTS, $index ); break; case 'revisionmonth': - # Let the edit saving system know we should parse the page - # *after* a revision ID has been assigned. This is for null edits. - $this->mOutput->setFlag( 'vary-revision' ); - wfDebug( __METHOD__ . ": {{REVISIONMONTH}} used, setting vary-revision...\n" ); - $value = substr( $this->getRevisionTimestamp(), 4, 2 ); + $value = $this->getRevisionTimestampSubstring( 4, 2, self::MAX_TTS, $index ); break; case 'revisionmonth1': - # Let the edit saving system know we should parse the page - # *after* a revision ID has been assigned. This is for null edits. - $this->mOutput->setFlag( 'vary-revision' ); - wfDebug( __METHOD__ . ": {{REVISIONMONTH1}} used, setting vary-revision...\n" ); - $value = intval( substr( $this->getRevisionTimestamp(), 4, 2 ) ); + $value = (int)$this->getRevisionTimestampSubstring( 4, 2, self::MAX_TTS, $index ); break; case 'revisionyear': - # Let the edit saving system know we should parse the page - # *after* a revision ID has been assigned. This is for null edits. - $this->mOutput->setFlag( 'vary-revision' ); - wfDebug( __METHOD__ . ": {{REVISIONYEAR}} used, setting vary-revision...\n" ); - $value = substr( $this->getRevisionTimestamp(), 0, 4 ); + $value = $this->getRevisionTimestampSubstring( 0, 4, self::MAX_TTS, $index ); break; case 'revisiontimestamp': # Let the edit saving system know we should parse the page @@ -2842,6 +2825,38 @@ class Parser { return $value; } + /** + * @param int $start + * @param int $len + * @param int $mtts Max time-till-save; sets vary-revision if result might change by then + * @param string $variable Parser variable name + * @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 ), '' ), + $start, + $len + ); + + if ( $resNow !== $resThen ) { + # Let the edit saving system know we should parse the page + # *after* a revision ID has been assigned. This is for null edits. + $this->mOutput->setFlag( 'vary-revision' ); + wfDebug( __METHOD__ . ": $variable used, setting vary-revision...\n" ); + } + } + + return $resNow; + } + /** * initialise the magic variables (like CURRENTMONTHNAME) and substitution modifiers * @@ -2997,7 +3012,7 @@ class Parser { * 'expansion-depth-exceeded-category') * @param string|int|null $current Current value * @param string|int|null $max Maximum allowed, when an explicit limit has been - * exceeded, provide the values (optional) + * exceeded, provide the values (optional) */ public function limitationWarn( $limitationType, $current = '', $max = '' ) { # does no harm if $current and $max are present but are unnecessary for the message @@ -3123,11 +3138,8 @@ class Parser { for ( $i = 0; $i < $argsLength; $i++ ) { $funcArgs[] = $args->item( $i ); } - try { - $result = $this->callParserFunction( $frame, $func, $funcArgs ); - } catch ( Exception $ex ) { - throw $ex; - } + + $result = $this->callParserFunction( $frame, $func, $funcArgs ); // Extract any forwarded flags if ( isset( $result['title'] ) ) { @@ -3677,8 +3689,10 @@ class Parser { * @param Title $title * @param array $options Array of options to RepoGroup::findFile * @return File|bool + * @deprecated since 1.32, use fetchFileAndTitle instead */ public function fetchFile( $title, $options = [] ) { + wfDeprecated( __METHOD__, '1.32' ); return $this->fetchFileAndTitle( $title, $options )[0]; } @@ -5087,17 +5101,15 @@ class Parser { } else { // Guess not, consider it as caption. wfDebug( "$parameterMatch failed parameter validation\n" ); - $label = '|' . $parameterMatch; + $label = $parameterMatch; } } } else { // Last pipe wins. - $label = '|' . $parameterMatch; + $label = $parameterMatch; } } - // Remove the pipe. - $label = substr( $label, 1 ); } $ig->add( $title, $label, $alt, $link, $handlerOptions );