* (bug 6243) Fix email for usernames containing dots when using PEAR::Mail
[lhc/web/wiklou.git] / includes / Title.php
index 0398727..75acdec 100644 (file)
@@ -8,9 +8,6 @@
 /** */
 require_once( 'normal/UtfNormal.php' );
 
-$wgTitleInterwikiCache = array();
-$wgTitleCache = array();
-
 define ( 'GAID_FOR_UPDATE', 1 );
 
 # Title::newFromTitle maintains a cache to avoid
@@ -28,6 +25,13 @@ define( 'MW_TITLECACHE_MAX', 1000 );
  * @package MediaWiki
  */
 class Title {
+       /**
+        * Static cache variables
+        */
+       static private $titleCache=array();
+       static private $interwikiCache=array();
+       
+       
        /**
         * All member variables should be considered private
         * Please use the accessor functions
@@ -105,11 +109,10 @@ class Title {
         * @access public
         */
        function newFromText( $text, $defaultNamespace = NS_MAIN ) {
-               global $wgTitleCache;
                $fname = 'Title::newFromText';
 
                if( is_object( $text ) ) {
-                       wfDebugDieBacktrace( 'Title::newFromText given an object' );
+                       throw new MWException( 'Title::newFromText given an object' );
                }
 
                /**
@@ -120,8 +123,8 @@ class Title {
                 *
                 * In theory these are value objects and won't get changed...
                 */
-               if( $defaultNamespace == NS_MAIN && isset( $wgTitleCache[$text] ) ) {
-                       return $wgTitleCache[$text];
+               if( $defaultNamespace == NS_MAIN && isset( Title::$titleCache[$text] ) ) {
+                       return Title::$titleCache[$text];
                }
 
                /**
@@ -138,11 +141,11 @@ class Title {
                        if( $defaultNamespace == NS_MAIN ) {
                                if( $cachedcount >= MW_TITLECACHE_MAX ) {
                                        # Avoid memory leaks on mass operations...
-                                       $wgTitleCache = array();
+                                       Title::$titleCache = array();
                                        $cachedcount=0;
                                }
                                $cachedcount++;
-                               $wgTitleCache[$text] =& $t;
+                               Title::$titleCache[$text] =& $t;
                        }
                        return $t;
                } else {
@@ -334,7 +337,6 @@ class Title {
         */
        /* static */ function indexTitle( $ns, $title ) {
                global $wgContLang;
-               require_once( 'SearchEngine.php' );
 
                $lc = SearchEngine::legalSearchChars() . '&#;';
                $t = $wgContLang->stripForSearch( $title );
@@ -375,15 +377,15 @@ class Title {
         * @access public
         */
        function getInterwikiLink( $key )  {
-               global $wgMemc, $wgDBname, $wgInterwikiExpiry, $wgTitleInterwikiCache;
+               global $wgMemc, $wgDBname, $wgInterwikiExpiry;
                global $wgInterwikiCache;
                $fname = 'Title::getInterwikiLink';
 
                $key = strtolower( $key );
 
                $k = $wgDBname.':interwiki:'.$key;
-               if( array_key_exists( $k, $wgTitleInterwikiCache ) ) {
-                       return $wgTitleInterwikiCache[$k]->iw_url;
+               if( array_key_exists( $k, Title::$interwikiCache ) ) {
+                       return Title::$interwikiCache[$k]->iw_url;
                }
 
                if ($wgInterwikiCache) {
@@ -393,7 +395,7 @@ class Title {
                $s = $wgMemc->get( $k );
                # Ignore old keys with no iw_local
                if( $s && isset( $s->iw_local ) && isset($s->iw_trans)) {
-                       $wgTitleInterwikiCache[$k] = $s;
+                       Title::$interwikiCache[$k] = $s;
                        return $s->iw_url;
                }
 
@@ -414,7 +416,7 @@ class Title {
                        $s->iw_trans = 0;
                }
                $wgMemc->set( $k, $s, $wgInterwikiExpiry );
-               $wgTitleInterwikiCache[$k] = $s;
+               Title::$interwikiCache[$k] = $s;
 
                return $s->iw_url;
        }
@@ -429,7 +431,6 @@ class Title {
         */
        function getInterwikiCached( $key ) {
                global $wgDBname, $wgInterwikiCache, $wgInterwikiScopes, $wgInterwikiFallbackSite;
-               global $wgTitleInterwikiCache;
                static $db, $site;
 
                if (!$db)
@@ -460,7 +461,7 @@ class Title {
                        $s->iw_url=$url;
                        $s->iw_local=(int)$local;
                }
-               $wgTitleInterwikiCache[$wgDBname.':interwiki:'.$key] = $s;
+               Title::$interwikiCache[$wgDBname.':interwiki:'.$key] = $s;
                return $s->iw_url;
        }
        /**
@@ -472,13 +473,13 @@ class Title {
         * @access public
         */
        function isLocal() {
-               global $wgTitleInterwikiCache, $wgDBname;
+               global $wgDBname;
 
                if ( $this->mInterwiki != '' ) {
                        # Make sure key is loaded into cache
                        $this->getInterwikiLink( $this->mInterwiki );
                        $k = $wgDBname.':interwiki:' . $this->mInterwiki;
-                       return (bool)($wgTitleInterwikiCache[$k]->iw_local);
+                       return (bool)(Title::$interwikiCache[$k]->iw_local);
                } else {
                        return true;
                }
@@ -492,14 +493,14 @@ class Title {
         * @access public
         */
        function isTrans() {
-               global $wgTitleInterwikiCache, $wgDBname;
+               global $wgDBname;
 
                if ($this->mInterwiki == '')
                        return false;
                # Make sure key is loaded into cache
                $this->getInterwikiLink( $this->mInterwiki );
                $k = $wgDBname.':interwiki:' . $this->mInterwiki;
-               return (bool)($wgTitleInterwikiCache[$k]->iw_trans);
+               return (bool)(Title::$interwikiCache[$k]->iw_trans);
        }
 
        /**
@@ -691,6 +692,23 @@ class Title {
                return $text;
        }
 
+       /**
+        * Get the base name, i.e. the leftmost parts before the /
+        * @return string Base name
+        */
+       function getBaseText() {
+               global $wgNamespacesWithSubpages;
+               if( isset( $wgNamespacesWithSubpages[ $this->mNamespace ] ) && $wgNamespacesWithSubpages[ $this->mNamespace ] ) {
+                       $parts = explode( '/', $this->getText() );
+                       # Don't discard the real title if there's no subpage involved
+                       if( count( $parts ) > 1 )
+                               unset( $parts[ count( $parts ) - 1 ] );
+                       return implode( '/', $parts );
+               } else {
+                       return $this->getText();
+               }
+       }
+
        /**
         * Get the lowest-level subpage name, i.e. the rightmost part after /
         * @return string Subpage name
@@ -771,10 +789,13 @@ class Title {
                                }
                                $url .= $query;
                        }
-                       if ( '' != $this->mFragment ) {
-                               $url .= '#' . $this->mFragment;
-                       }
                }
+
+               # Finally, add the fragment.
+               if ( '' != $this->mFragment ) {
+                       $url .= '#' . $this->mFragment;
+               }
+
                wfRunHooks( 'GetFullURL', array( &$this, &$url, $query ) );
                return $url;
        }
@@ -1008,14 +1029,6 @@ class Title {
                        return false;
                }
 
-               # protect global styles and js
-               if ( NS_MEDIAWIKI == $this->mNamespace
-                && preg_match("/\\.(css|js)$/", $this->mTextform )
-                    && !$wgUser->isAllowed('editinterface') ) {
-                       wfProfileOut( $fname );
-                       return false;
-               }
-
                # protect css/js subpages of user pages
                # XXX: this might be better using restrictions
                # XXX: Find a way to work around the php bug that prevents using $this->userCanEditCssJsSubpage() from working
@@ -1517,6 +1530,11 @@ class Title {
                        return false;
                }
 
+               // Any remaining initial :s are illegal.
+               if ( $t !== '' && ':' == $t{0} ) {
+                       return false;
+               }
+               
                # Fill fields
                $this->mDbkeyform = $t;
                $this->mUrlform = wfUrlencode( $t );
@@ -2250,7 +2268,7 @@ class Title {
                                return 'nstab-special';
                        case NS_PROJECT:
                        case NS_PROJECT_TALK:
-                               return 'nstab-wp';
+                               return 'nstab-project';
                        case NS_IMAGE:
                        case NS_IMAGE_TALK:
                                return 'nstab-image';