<?php
+
/**
- * Output of the PHP parser
+ * Output of the PHP parser.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* @file
* @ingroup Parser
*/
-
-/**
- * @todo document
- * @ingroup Parser
- */
-class CacheTime {
- var $mVersion = Parser::VERSION, # Compatibility check
- $mCacheTime = '', # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
- $mCacheExpiry = null, # Seconds after which the object should expire, use 0 for uncachable. Used in ParserCache.
- $mContainsOldMagic; # Boolean variable indicating if the input contained variables like {{CURRENTDAY}}
-
- function getCacheTime() { return $this->mCacheTime; }
-
- function containsOldMagic() { return $this->mContainsOldMagic; }
- function setContainsOldMagic( $com ) { return wfSetVar( $this->mContainsOldMagic, $com ); }
-
- /**
- * setCacheTime() sets the timestamp expressing when the page has been rendered.
- * This doesn not control expiry, see updateCacheExpiry() for that!
- * @param $t string
- * @return string
- */
- function setCacheTime( $t ) { return wfSetVar( $this->mCacheTime, $t ); }
-
- /**
- * Sets the number of seconds after which this object should expire.
- * This value is used with the ParserCache.
- * If called with a value greater than the value provided at any previous call,
- * the new call has no effect. The value returned by getCacheExpiry is smaller
- * or equal to the smallest number that was provided as an argument to
- * updateCacheExpiry().
- *
- * @param $seconds number
- */
- function updateCacheExpiry( $seconds ) {
- $seconds = (int)$seconds;
-
- if ( $this->mCacheExpiry === null || $this->mCacheExpiry > $seconds ) {
- $this->mCacheExpiry = $seconds;
- }
-
- // hack: set old-style marker for uncacheable entries.
- if ( $this->mCacheExpiry !== null && $this->mCacheExpiry <= 0 ) {
- $this->mCacheTime = -1;
- }
- }
-
- /**
- * Returns the number of seconds after which this object should expire.
- * This method is used by ParserCache to determine how long the ParserOutput can be cached.
- * The timestamp of expiry can be calculated by adding getCacheExpiry() to getCacheTime().
- * The value returned by getCacheExpiry is smaller or equal to the smallest number
- * that was provided to a call of updateCacheExpiry(), and smaller or equal to the
- * value of $wgParserCacheExpireTime.
- * @return int|mixed|null
- */
- function getCacheExpiry() {
- global $wgParserCacheExpireTime;
-
- if ( $this->mCacheTime < 0 ) {
- return 0;
- } // old-style marker for "not cachable"
-
- $expire = $this->mCacheExpiry;
-
- if ( $expire === null ) {
- $expire = $wgParserCacheExpireTime;
- } else {
- $expire = min( $expire, $wgParserCacheExpireTime );
- }
-
- if( $this->containsOldMagic() ) { //compatibility hack
- $expire = min( $expire, 3600 ); # 1 hour
- }
-
- if ( $expire <= 0 ) {
- return 0; // not cachable
- } else {
- return $expire;
- }
- }
-
- /**
- * @return bool
- */
- function isCacheable() {
- return $this->getCacheExpiry() > 0;
- }
-
- /**
- * Return true if this cached output object predates the global or
- * per-article cache invalidation timestamps, or if it comes from
- * an incompatible older version.
- *
- * @param $touched String: the affected article's last touched timestamp
- * @return Boolean
- */
- public function expired( $touched ) {
- global $wgCacheEpoch;
- return !$this->isCacheable() || // parser says it's uncacheable
- $this->getCacheTime() < $touched ||
- $this->getCacheTime() <= $wgCacheEpoch ||
- $this->getCacheTime() < wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) || // expiry period has passed
- !isset( $this->mVersion ) ||
- version_compare( $this->mVersion, Parser::VERSION, "lt" );
- }
-}
-
class ParserOutput extends CacheTime {
var $mText, # The output text
$mLanguageLinks, # List of the full text of language links, in the order they appear
$mTimestamp; # Timestamp of the revision
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 instances of DataUpdate, used to cause some information extracted from the page in a custom place.
+ private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else.
const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
/**
* callback used by getText to replace editsection tokens
* @private
+ * @param $m
+ * @throws MWException
* @return mixed
*/
function replaceEditSectionLinksCallback( $m ) {
return (bool)$this->mNewSection;
}
+ /**
+ * Checks, if a url is pointing to the own server
+ *
+ * @param $internal String the server to check against
+ * @param $url String the url to check
+ * @return bool
+ */
+ static function isLinkInternal( $internal, $url ) {
+ return (bool)preg_match( '/^' .
+ # If server is proto relative, check also for http/https links
+ ( substr( $internal, 0, 2 ) === '//' ? '(?:https?:)?' : '' ) .
+ preg_quote( $internal, '/' ) .
+ # check for query/path/anchor or end of link in each case
+ '(?:[\?\/\#]|$)/i',
+ $url
+ );
+ }
+
function addExternalLink( $url ) {
# We don't register links pointing to our own server, unless... :-)
global $wgServer, $wgRegisterInternalExternals;
- if( $wgRegisterInternalExternals or stripos($url,$wgServer.'/')!==0)
+
+ $registerExternalLink = true;
+ if( !$wgRegisterInternalExternals ) {
+ $registerExternalLink = !self::isLinkInternal( $wgServer, $url );
+ }
+ if( $registerExternalLink ) {
$this->mExternalLinks[$url] = 1;
+ }
}
/**
* Adds an update job to the output. Any update jobs added to the output will eventually bexecuted in order to
* store any secondary information extracted from the page's content.
*
- * @param StorageUpdate $update
+ * @since 1.20
+ *
+ * @param DataUpdate $update
*/
public function addSecondaryDataUpdate( DataUpdate $update ) {
$this->mSecondaryDataUpdates[] = $update;
* @note: Avoid using this method directly, use ContentHandler::getSecondaryDataUpdates() instead! The content
* handler may provide additional update objects.
*
- * @param $title Title of the page we're updating. If not given, a title object will be created based on $this->getTitleText()
+ * @since 1.20
+ *
+ * @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 $recursive Boolean: queue jobs for recursive updates?
*
* @return Array. An array of instances of DataUpdate
*/
public function getSecondaryDataUpdates( Title $title = null, $recursive = true ) {
- if ( !$title ) {
+ if ( is_null( $title ) ) {
$title = Title::newFromText( $this->getTitleText() );
}
$linksUpdate = new LinksUpdate( $title, $this, $recursive );
- if ( !$this->mSecondaryDataUpdates ) {
+ if ( $this->mSecondaryDataUpdates === array() ) {
return array( $linksUpdate );
} else {
$updates = array_merge( $this->mSecondaryDataUpdates, array( $linksUpdate ) );
return $updates;
}
+
}