* @ingroup Parser
*/
class ParserOutput extends CacheTime {
+ /**
+ * Feature flag to indicate to extensions that MediaWiki core supports and
+ * uses getText() stateless transforms.
+ */
+ const SUPPORTS_STATELESS_TRANSFORMS = 1;
+
/**
* @var string $mText The output text
*/
public $mSections = [];
/**
+ * @deprecated since 1.31 Use getText() options.
* @var bool $mEditSectionTokens prefix/suffix markers if edit sections were output as tokens.
*/
- public $mEditSectionTokens = false;
+ public $mEditSectionTokens = true;
/**
* @var array $mProperties Name/value pairs to be cached in the DB.
public $mTimestamp;
/**
+ * @deprecated since 1.31 Use getText() options.
* @var bool $mTOCEnabled Whether TOC should be shown, can't override __NOTOC__.
*/
public $mTOCEnabled = true;
// finalizeAdaptiveCacheExpiry() uses TTL = MAX( m * PARSE_TIME + b, MIN_AR_TTL)
// Current values imply that m=3933.333333 and b=-333.333333
// See https://www.nngroup.com/articles/website-response-times/
- const PARSE_FAST_SEC = .100; // perceived "fast" page parse
+ const PARSE_FAST_SEC = 0.100; // perceived "fast" page parse
const PARSE_SLOW_SEC = 1.0; // perceived "slow" page parse
const FAST_AR_TTL = 60; // adaptive TTL for "fast" pages
const SLOW_AR_TTL = 3600; // adaptive TTL for "slow" pages
* return value is suitable for writing back via setText() but is not valid
* for display to the user.
*
+ * @return string
* @since 1.27
*/
public function getRawText() {
return $this->mText;
}
- public function getText() {
+ /**
+ * Get the output HTML
+ *
+ * @param array $options (since 1.31) Transformations to apply to the HTML
+ * - allowTOC: (bool) Show the TOC, assuming there were enough headings
+ * to generate one and `__NOTOC__` wasn't used. Default is true,
+ * but might be statefully overridden.
+ * - enableSectionEditLinks: (bool) Include section edit links, assuming
+ * section edit link tokens are present in the HTML. Default is true,
+ * but might be statefully overridden.
+ * @return string HTML
+ */
+ public function getText( $options = [] ) {
+ // @todo Warn if !array_key_exists( 'allowTOC', $options ) && empty( $this->mTOCEnabled )
+
+ // @todo Warn if !array_key_exists( 'enableSectionEditLinks', $options )
+ // && !$this->mEditSectionTokens
+ // Note that while $this->mEditSectionTokens formerly defaulted to false,
+ // ParserOptions->getEditSection() defaults to true and Parser copies
+ // that to us so true makes more sense as the stateless default.
+
+ $options += [
+ // empty() here because old cached versions might lack the field somehow.
+ // In that situation, the historical behavior (possibly buggy) is to remove the TOC.
+ 'allowTOC' => !empty( $this->mTOCEnabled ),
+ 'enableSectionEditLinks' => $this->mEditSectionTokens,
+ ];
$text = $this->mText;
- if ( $this->mEditSectionTokens ) {
+
+ Hooks::runWithoutAbort( 'ParserOutputPostCacheTransform', [ $this, &$text, &$options ] );
+
+ if ( $options['enableSectionEditLinks'] ) {
$text = preg_replace_callback(
self::EDITSECTION_REGEX,
function ( $m ) {
global $wgOut, $wgLang;
$editsectionPage = Title::newFromText( htmlspecialchars_decode( $m[1] ) );
$editsectionSection = htmlspecialchars_decode( $m[2] );
- $editsectionContent = isset( $m[4] ) ? $m[3] : null;
+ $editsectionContent = isset( $m[4] ) ? Sanitizer::decodeCharReferences( $m[3] ) : null;
if ( !is_object( $editsectionPage ) ) {
throw new MWException( "Bad parser output text." );
$text = preg_replace( self::EDITSECTION_REGEX, '', $text );
}
- // If you have an old cached version of this class - sorry, you can't disable the TOC
- if ( isset( $this->mTOCEnabled ) && $this->mTOCEnabled ) {
+ if ( $options['allowTOC'] ) {
$text = str_replace( [ Parser::TOC_START, Parser::TOC_END ], '', $text );
} else {
$text = preg_replace(
$text
);
}
+
return $text;
}
$this->mSpeculativeRevId = $id;
}
- /** @since 1.28 */
+ /**
+ * @return int|null
+ * @since 1.28
+ */
public function getSpeculativeRevIdUsed() {
return $this->mSpeculativeRevId;
}
}
/**
+ * @return array
* @since 1.25
*/
public function getIndicators() {
return $this->mSections;
}
+ /**
+ * @deprecated since 1.31 Use getText() options.
+ */
public function getEditSectionTokens() {
return $this->mEditSectionTokens;
}
return $this->mModuleStyles;
}
- /** @since 1.23 */
+ /**
+ * @return array
+ * @since 1.23
+ */
public function getJsConfigVars() {
return $this->mJsConfigVars;
}
return $this->mLimitReportJSData;
}
+ /**
+ * @deprecated since 1.31 Use getText() options.
+ */
public function getTOCEnabled() {
return $this->mTOCEnabled;
}
return wfSetVar( $this->mSections, $toc );
}
+ /**
+ * @deprecated since 1.31 Use getText() options.
+ */
public function setEditSectionTokens( $t ) {
return wfSetVar( $this->mEditSectionTokens, $t );
}
return wfSetVar( $this->mTimestamp, $timestamp );
}
+ /**
+ * @deprecated since 1.31 Use getText() options.
+ */
public function setTOCEnabled( $flag ) {
return wfSetVar( $this->mTOCEnabled, $flag );
}
}
/**
+ * @param string $id
+ * @param string $content
* @since 1.25
*/
public function setIndicator( $id, $content ) {
* @code
* $parser->getOutput()->my_ext_foo = '...';
* @endcode
+ * @param string $name
+ * @param mixed $value
*/
public function setProperty( $name, $value ) {
$this->mProperties[$name] = $value;