give path when not able to write the thumb
[lhc/web/wiklou.git] / includes / WikiMap.php
index 545e6a3..1190172 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Tools for dealing with other locally-hosted wikis.
+ *
+ * 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
+ */
 
 /**
  * Helper tools for dealing with other locally-hosted wikis
@@ -17,23 +37,24 @@ class WikiMap {
                $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;
                }
+               $canonicalServer = $wgConf->get( 'wgCanonicalServer', $wikiID, $major,
+                       array( 'lang' => $minor, 'site' => $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, $canonicalServer, $path, $server );
        }
-       
+
        /**
         * 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
+        * @return string|int Wiki's name or $wiki_id if the wiki was not found
         */
        public static function getWikiName( $wikiID ) {
                $wiki = WikiMap::getWiki( $wikiID );
@@ -86,11 +107,11 @@ class WikiMap {
         */
        public static function getForeignURL( $wikiID, $page ) {
                $wiki = WikiMap::getWiki( $wikiID );
-               
+
                if ( $wiki ) {
                        return $wiki->getUrl( $page );
                }
-                       
+
                return false;
        }
 }
@@ -101,21 +122,27 @@ class WikiMap {
 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'
+       private $mCanonicalServer; ///< canonical server URL, e.g. 'http://www.mediawiki.org'
+       private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org'
+       private $mPath;   ///< path, '/wiki/$1'
 
-       public function __construct( $major, $minor, $server, $path ) {
+       public function __construct( $major, $minor, $canonicalServer, $path, $server = null ) {
                $this->mMajor = $major;
                $this->mMinor = $minor;
-               $this->mServer = $server;
+               $this->mCanonicalServer = $canonicalServer;
                $this->mPath = $path;
+               $this->mServer = $server === null ? $canonicalServer : $server;
        }
 
+       /**
+        * @return string
+        * @throws MWException
+        */
        public function getHostname() {
                $prefixes = array( 'http://', 'https://' );
                foreach ( $prefixes as $prefix ) {
-                       if ( substr( $this->mServer, 0, strlen( $prefix ) ) ) {
-                               return substr( $this->mServer, strlen( $prefix ) );
+                       if ( substr( $this->mCanonicalServer, 0, strlen( $prefix ) ) ) {
+                               return substr( $this->mCanonicalServer, strlen( $prefix ) );
                        }
                }
                throw new MWException( "Invalid hostname for wiki {$this->mMinor}.{$this->mMajor}" );
@@ -150,12 +177,31 @@ class WikiReference {
        }
 
        /**
-        * Get a URL to a page on this foreign wiki
+        * Get a canonical (i.e. based on $wgCanonicalServer) 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 getCanonicalUrl( $page ) {
+               return $this->mCanonicalServer . $this->getLocalUrl( $page );
+       }
+
+       /**
+        * Alias for getCanonicalUrl(), for backwards compatibility.
+        * @return String
+        */
        public function getUrl( $page ) {
+               return $this->getCanonicalUrl( $page );
+       }
+
+       /**
+        * Get a URL based on $wgServer, like Title::getFullUrl() would produce
+        * when called locally on the wiki.
+        *
+        * @param $page String: page name (must be normalized before calling this function!)
+        * @return String: URL
+        */
+       public function getFullUrl( $page ) {
                return
                        $this->mServer .
                        $this->getLocalUrl( $page );