Fix indentation whitespace errors
[lhc/web/wiklou.git] / includes / parser / ParserOutput.php
index 62d3bfd..b6bcf63 100644 (file)
@@ -1,6 +1,7 @@
 <?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
@@ -157,7 +50,7 @@ class ParserOutput extends CacheTime {
                $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 SecondaryDataObject(), 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>))#';
 
@@ -182,6 +75,8 @@ class ParserOutput extends CacheTime {
        /**
         * callback used by getText to replace editsection tokens
         * @private
+        * @param $m
+        * @throws MWException
         * @return mixed
         */
        function replaceEditSectionLinksCallback( $m ) {
@@ -257,11 +152,35 @@ class ParserOutput extends CacheTime {
                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;
+               }
        }
 
        /**
@@ -469,7 +388,9 @@ class ParserOutput extends CacheTime {
         * 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;
@@ -480,19 +401,25 @@ class ParserOutput extends CacheTime {
         * extracted from the page's content, including a LinksUpdate object for all links stored in
         * this ParserOutput object.
         *
-        * @param $title Title of the page we're updating. If not given, a title object will be created based on $this->getTitleText()
+        * @note: Avoid using this method directly, use ContentHandler::getSecondaryDataUpdates() instead! The content
+        *        handler may provide additional update objects.
+        *
+        * @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 ) );
@@ -500,4 +427,5 @@ class ParserOutput extends CacheTime {
 
                return $updates;
         }
+
 }