* @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;
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;
}
return $this->mSections;
}
+ /**
+ * @deprecated since 1.31 Use getText() options.
+ */
public function getEditSectionTokens() {
return $this->mEditSectionTokens;
}
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 );
}