Fix indentation whitespace errors
[lhc/web/wiklou.git] / includes / parser / ParserOutput.php
index 906690b..b6bcf63 100644 (file)
 <?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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @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 ); }
-
-       /**abstract
-        * 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
@@ -141,9 +48,9 @@ class ParserOutput extends CacheTime {
                $mProperties = array(),       # Name/value pairs to be cached in the DB
                $mTOCHTML = '',               # HTML of the TOC
                $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 $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.
 
        const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
 
@@ -168,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 ) {
@@ -243,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;
+               }
        }
 
        /**
@@ -334,7 +267,7 @@ class ParserOutput extends CacheTime {
        }
 
        /**
-        * Add some text to the <head>.
+        * Add some text to the "<head>".
         * If $tag is set, the section with that tag will only be included once
         * in a given page.
         */
@@ -451,34 +384,48 @@ class ParserOutput extends CacheTime {
                 $this->mAccessedOptions[$option] = true;
         }
 
-    /**
-     * 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 SecondaryDataUpdate $update
-     */
-    public function addSecondaryDataUpdate( SecondaryDataUpdate $update ) {
-        $this->mSecondaryDataUpdates[] = $update;
-    }
-
-    /**
-     * Returns any SecondaryDataUpdate jobs to be executed in order to store secondary information
-     * extracted from the page's content, includingt a LinksUpdate object for all links stopred 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()
-     * @param $recursive Boolean: queue jobs for recursive updates?
-     *
-     * @return array an array of instances of SecondaryDataUpdate
-     */
-    public function getSecondaryDataUpdates( Title $title = null, $recursive = true ) {
-        if ( is_null( $title ) ) {
-            $title = Title::newFromText( $this->getTitleText() );
-        }
-
-        return array_merge(
-                       $this->mSecondaryDataUpdates,
-                       array( new LinksUpdate( $title, $this, $recursive ) )
-               );
-    }
+       /**
+        * 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.
+        *
+        * @since 1.20
+        *
+        * @param DataUpdate $update
+        */
+       public function addSecondaryDataUpdate( DataUpdate $update ) {
+               $this->mSecondaryDataUpdates[] = $update;
+       }
+
+       /**
+        * 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.
+        *
+        * @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 ( is_null( $title ) ) {
+                       $title = Title::newFromText( $this->getTitleText() );
+               }
+
+               $linksUpdate = new LinksUpdate( $title, $this, $recursive );
+
+               if ( $this->mSecondaryDataUpdates === array() ) {
+                       return array( $linksUpdate );
+               } else {
+                       $updates = array_merge( $this->mSecondaryDataUpdates, array( $linksUpdate ) );
+               }
+
+               return $updates;
+        }
+
 }