summaryrefslogtreecommitdiff
path: root/includes/parser/ParserOutput.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/parser/ParserOutput.php')
-rw-r--r--includes/parser/ParserOutput.php141
1 files changed, 112 insertions, 29 deletions
diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php
index 5037ce18..65b527c8 100644
--- a/includes/parser/ParserOutput.php
+++ b/includes/parser/ParserOutput.php
@@ -25,6 +25,7 @@ class ParserOutput extends CacheTime {
public $mText, # The output text
$mLanguageLinks, # List of the full text of language links, in the order they appear
$mCategories, # Map of category names to sort keys
+ $mIndicators = array(), # Page status indicators, usually displayed in top-right corner
$mTitleText, # title text of the chosen language variant
$mLinks = array(), # 2-D map of NS/DBK to ID for the links in the document. ID=zero for broken.
$mTemplates = array(), # 2-D map of NS/DBK to ID for the template references. ID=zero for broken.
@@ -52,27 +53,25 @@ class ParserOutput extends CacheTime {
$mTOCEnabled = true; # Whether TOC should be shown, can't override __NOTOC__
private $mIndexPolicy = ''; # 'index' or 'noindex'? Any other value will result in no change.
private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
- private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else.
private $mExtensionData = array(); # extra data used by extensions
private $mLimitReportData = array(); # Parser limit report data
private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
private $mPreventClickjacking = false; # Whether to emit X-Frame-Options: DENY
+ private $mFlags = array(); # Generic flags
const EDITSECTION_REGEX =
'#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
public function __construct( $text = '', $languageLinks = array(), $categoryLinks = array(),
- $containsOldMagic = false, $titletext = ''
+ $unused = false, $titletext = ''
) {
$this->mText = $text;
$this->mLanguageLinks = $languageLinks;
$this->mCategories = $categoryLinks;
- $this->mContainsOldMagic = $containsOldMagic;
$this->mTitleText = $titletext;
}
public function getText() {
- wfProfileIn( __METHOD__ );
$text = $this->mText;
if ( $this->mEditSectionTokens ) {
$text = preg_replace_callback(
@@ -110,7 +109,6 @@ class ParserOutput extends CacheTime {
$text
);
}
- wfProfileOut( __METHOD__ );
return $text;
}
@@ -130,6 +128,13 @@ class ParserOutput extends CacheTime {
return $this->mCategories;
}
+ /**
+ * @since 1.25
+ */
+ public function getIndicators() {
+ return $this->mIndicators;
+ }
+
public function getTitleText() {
return $this->mTitleText;
}
@@ -267,6 +272,13 @@ class ParserOutput extends CacheTime {
$this->mCategories[$c] = $sort;
}
+ /**
+ * @since 1.25
+ */
+ public function setIndicator( $id, $content ) {
+ $this->mIndicators[$id] = $content;
+ }
+
public function addLanguageLink( $t ) {
$this->mLanguageLinks[] = $t;
}
@@ -472,6 +484,47 @@ class ParserOutput extends CacheTime {
}
/**
+ * Add a tracking category, getting the title from a system message,
+ * or print a debug message if the title is invalid.
+ *
+ * Any message used with this function should be registered so it will
+ * show up on Special:TrackingCategories. Core messages should be added
+ * to SpecialTrackingCategories::$coreTrackingCategories, and extensions
+ * should add to "TrackingCategories" in their extension.json.
+ *
+ * @param string $msg Message key
+ * @param Title $title title of the page which is being tracked
+ * @return bool Whether the addition was successful
+ * @since 1.25
+ */
+ public function addTrackingCategory( $msg, $title ) {
+ if ( $title->getNamespace() === NS_SPECIAL ) {
+ wfDebug( __METHOD__ . ": Not adding tracking category $msg to special page!\n" );
+ return false;
+ }
+
+ // Important to parse with correct title (bug 31469)
+ $cat = wfMessage( $msg )
+ ->title( $title )
+ ->inContentLanguage()
+ ->text();
+
+ # Allow tracking categories to be disabled by setting them to "-"
+ if ( $cat === '-' ) {
+ return false;
+ }
+
+ $containerCategory = Title::makeTitleSafe( NS_CATEGORY, $cat );
+ if ( $containerCategory ) {
+ $this->addCategory( $containerCategory->getDBkey(), $this->getProperty( 'defaultsort' ) ?: '' );
+ return true;
+ } else {
+ wfDebug( __METHOD__ . ": [[MediaWiki:$msg]] is not a valid title!\n" );
+ return false;
+ }
+ }
+
+ /**
* Override the title to be used for display
* -- this is assumed to have been validated
* (check equal normalisation, etc.)
@@ -622,43 +675,57 @@ class ParserOutput extends CacheTime {
}
/**
- * Adds an update job to the output. Any update jobs added to the output will
- * eventually be executed in order to store any secondary information extracted
- * from the page's content. This is triggered by calling getSecondaryDataUpdates()
- * and is used for forward links updates on edit and backlink updates by jobs.
+ * @deprecated since 1.25. Instead, store any relevant data using setExtensionData,
+ * and implement Content::getSecondaryDataUpdates() if possible, or use the
+ * 'SecondaryDataUpdates' hook to construct the necessary update objects.
*
- * @since 1.20
+ * @note Hard deprecation and removal without long deprecation period, since there are no
+ * known users, but known conceptual issues.
+ *
+ * @todo remove in 1.26
*
* @param DataUpdate $update
+ *
+ * @throws MWException
*/
public function addSecondaryDataUpdate( DataUpdate $update ) {
- $this->mSecondaryDataUpdates[] = $update;
+ wfDeprecated( __METHOD__, '1.25' );
+ throw new MWException( 'ParserOutput::addSecondaryDataUpdate() is no longer supported. Override Content::getSecondaryDataUpdates() or use the SecondaryDataUpdates hook instead.' );
}
/**
- * Returns any DataUpdate jobs to be executed in order to store secondary information
- * extracted from the page's content, including a LinksUpdate object for all links stored in
- * this ParserOutput object.
+ * @deprecated since 1.25.
*
- * @note Avoid using this method directly, use ContentHandler::getSecondaryDataUpdates()
- * instead! The content handler may provide additional update objects.
+ * @note Hard deprecation and removal without long deprecation period, since there are no
+ * known users, but known conceptual issues.
*
- * @since 1.20
+ * @todo remove in 1.26
*
- * @param Title $title The title of the page we're updating. If not given, a title object will
- * be created based on $this->getTitleText()
- * @param bool $recursive Queue jobs for recursive updates?
+ * @return bool false (since 1.25)
+ */
+ public function hasCustomDataUpdates() {
+ wfDeprecated( __METHOD__, '1.25' );
+ return false;
+ }
+
+ /**
+ * @deprecated since 1.25. Instead, store any relevant data using setExtensionData,
+ * and implement Content::getSecondaryDataUpdates() if possible, or use the
+ * 'SecondaryDataUpdates' hook to construct the necessary update objects.
+ *
+ * @note Hard deprecation and removal without long deprecation period, since there are no
+ * known users, but known conceptual issues.
+ *
+ * @todo remove in 1.26
+ *
+ * @param Title $title
+ * @param bool $recursive
*
* @return array An array of instances of DataUpdate
*/
public function getSecondaryDataUpdates( Title $title = null, $recursive = true ) {
- if ( is_null( $title ) ) {
- $title = Title::newFromText( $this->getTitleText() );
- }
-
- $linksUpdate = new LinksUpdate( $title, $this, $recursive );
-
- return array_merge( $this->mSecondaryDataUpdates, array( $linksUpdate ) );
+ wfDeprecated( __METHOD__, '1.25' );
+ return array();
}
/**
@@ -795,6 +862,22 @@ class ParserOutput extends CacheTime {
}
/**
+ * Check whether the cache TTL was lowered due to dynamic content
+ *
+ * When content is determined by more than hard state (e.g. page edits),
+ * such as template/file transclusions based on the current timestamp or
+ * extension tags that generate lists based on queries, this return true.
+ *
+ * @return bool
+ * @since 1.25
+ */
+ public function hasDynamicContent() {
+ global $wgParserCacheExpireTime;
+
+ return $this->getCacheExpiry() < $wgParserCacheExpireTime;
+ }
+
+ /**
* Get or set the prevent-clickjacking flag
*
* @since 1.24
@@ -806,13 +889,13 @@ class ParserOutput extends CacheTime {
}
/**
- * Save space for for serialization by removing useless values
+ * Save space for serialization by removing useless values
* @return array
*/
public function __sleep() {
return array_diff(
array_keys( get_object_vars( $this ) ),
- array( 'mSecondaryDataUpdates', 'mParseStartTime' )
+ array( 'mParseStartTime' )
);
}
}