Call Linker methods statically
[lhc/web/wiklou.git] / includes / WikiMap.php
index 6b6147b..35587f2 100644 (file)
 /**
  * Helper tools for dealing with other locally-hosted wikis
  */
-
 class WikiMap {
-       static function getWiki( $wikiID ) {
-               global $wgConf, $IP;
-               
+
+       /**
+        * Get a WikiReference object for $wikiID
+        *
+        * @param $wikiID String: wiki'd id (generally database name)
+        * @return WikiReference object or null if the wiki was not found
+        */
+       public static function getWiki( $wikiID ) {
+               global $wgConf;
+
                $wgConf->loadFullData();
 
                list( $major, $minor ) = $wgConf->siteFromDB( $wikiID );
-               if( isset( $major ) ) {
-                       $server = $wgConf->get( 'wgServer', $wikiID, $major,
-                               array( 'lang' => $minor, 'site' => $major ) );
-                       $path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
-                               array( 'lang' => $minor, 'site' => $major ) );
-                       return new WikiReference( $major, $minor, $server, $path );
-               } else {
+               if( $major === null ) {
                        return null;
                }
+               $server = $wgConf->get( 'wgCanonicalServer', $wikiID, $major,
+                       array( 'lang' => $minor, 'site' => $major ) );
+               $path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
+                       array( 'lang' => $minor, 'site' => $major ) );
+               return new WikiReference( $major, $minor, $server, $path );
        }
        
-       // Convenience functions from GlobalBlocking
-       static function getWikiName( $wiki_id ) {
-               // We can give more info than just the wiki id!
-               $wiki = WikiMap::getWiki( $wiki_id );
-                       
-               if ($wiki) {
+       /**
+        * Convenience to get the wiki's display name
+        *
+        * @todo We can give more info than just the wiki id!
+        * @param $wikiID String: wiki'd id (generally database name)
+        * @return Wiki's name or $wiki_id if the wiki was not found
+        */
+       public static function getWikiName( $wikiID ) {
+               $wiki = WikiMap::getWiki( $wikiID );
+
+               if ( $wiki ) {
                        return $wiki->getDisplayName();
                }
-               return $wiki_id;
+               return $wikiID;
        }
-       
-       static function foreignUserLink( $wiki_id, $user ) {
-               return self::makeForeignLink( $wiki_id, "User:$user" );
+
+       /**
+        * Convenience to get a link to a user page on a foreign wiki
+        *
+        * @param $wikiID String: wiki'd id (generally database name)
+        * @param $user String: user name (must be normalised before calling this function!)
+        * @param $text String: link's text; optional, default to "User:$user"
+        * @return String: HTML link or false if the wiki was not found
+        */
+       public static function foreignUserLink( $wikiID, $user, $text=null ) {
+               return self::makeForeignLink( $wikiID, "User:$user", $text );
        }
-       
-       static function makeForeignLink( $wiki_id, $page, $text=null ) {
-               global $wgUser;
-               $sk = $wgUser->getSkin();
-               
-               if (!$text)
-                       $text=$page;
-               
-               return $sk->makeExternalLink( self::getForeignURL( $wiki_id, $page ) , $text );
+
+       /**
+        * Convenience to get a link to a page on a foreign wiki
+        *
+        * @param $wikiID String: wiki'd id (generally database name)
+        * @param $page String: page name (must be normalised before calling this function!)
+        * @param $text String: link's text; optional, default to $page
+        * @return String: HTML link or false if the wiki was not found
+        */
+       public static function makeForeignLink( $wikiID, $page, $text=null ) {
+               if ( !$text ) {
+                       $text = $page;
+               }
+
+               $url = self::getForeignURL( $wikiID, $page );
+               if ( $url === false ) {
+                       return false;
+               }
+
+               return Linker::makeExternalLink( $url, $text );
        }
-       
-       static function getForeignURL( $wiki_id, $page ) {
-               $wiki = WikiMap::getWiki( $wiki_id );
+
+       /**
+        * Convenience to get a url to a page on a foreign wiki
+        *
+        * @param $wikiID String: wiki'd id (generally database name)
+        * @param $page String: page name (must be normalised before calling this function!)
+        * @return String: URL or false if the wiki was not found
+        */
+       public static function getForeignURL( $wikiID, $page ) {
+               $wiki = WikiMap::getWiki( $wikiID );
                
-               if ($wiki)
+               if ( $wiki ) {
                        return $wiki->getUrl( $page );
+               }
                        
                return false;
        }
 }
 
+/**
+ * Reference to a locally-hosted wiki
+ */
 class WikiReference {
        private $mMinor; ///< 'en', 'meta', 'mediawiki', etc
        private $mMajor; ///< 'wiki', 'wiktionary', etc
        private $mServer; ///< server override, 'www.mediawiki.org'
        private $mPath;   ///< path override, '/wiki/$1'
 
-       function __construct( $major, $minor, $server, $path ) {
+       public function __construct( $major, $minor, $server, $path ) {
                $this->mMajor = $major;
                $this->mMinor = $minor;
                $this->mServer = $server;
                $this->mPath = $path;
        }
 
-       function getHostname() {
+       public function getHostname() {
                $prefixes = array( 'http://', 'https://' );
                foreach ( $prefixes as $prefix ) {
                        if ( substr( $this->mServer, 0, strlen( $prefix ) ) ) {
@@ -81,25 +121,42 @@ class WikiReference {
        }
 
        /**
-        * pretty it up
+        * Get the the URL in a way to de displayed to the user
+        * More or less Wikimedia specific
+        *
+        * @return String
         */
-       function getDisplayName() {
+       public function getDisplayName() {
                $url = $this->getUrl( '' );
-               $url = preg_replace( '!^https?://!', '', $url );
-               $url = preg_replace( '!/index\.php(\?title=|/)$!', '/', $url );
-               $url = preg_replace( '!/wiki/$!', '/', $url );
-               $url = preg_replace( '!/$!', '', $url );
-               return $url;
+               $parsed = wfParseUrl( $url );
+               if ( $parsed ) {
+                       return $parsed['host'];
+               } else {
+                       // Invalid URL. There's no sane thing to do here, so just return it
+                       return $url;
+               }
        }
 
+       /**
+        * Helper function for getUrl()
+        *
+        * @todo FIXME: This may be generalized...
+        * @param $page String: page name (must be normalised before calling this function!)
+        * @return String: Url fragment
+        */
        private function getLocalUrl( $page ) {
-               // FIXME: this may be generalized...
                return str_replace( '$1', wfUrlEncode( str_replace( ' ', '_', $page ) ), $this->mPath );
        }
 
-       function getUrl( $page ) {
+       /**
+        * Get a URL to a page on this foreign wiki
+        *
+        * @param $page String: page name (must be normalised before calling this function!)
+        * @return String: Url
+        */
+       public function getUrl( $page ) {
                return
-                       $this->mServer . 
+                       $this->mServer .
                        $this->getLocalUrl( $page );
        }
 }