00001 <?php
00002
00006 class WikiMap {
00007
00014 public static function getWiki( $wikiID ) {
00015 global $wgConf, $IP;
00016
00017 $wgConf->loadFullData();
00018
00019 list( $major, $minor ) = $wgConf->siteFromDB( $wikiID );
00020 if( isset( $major ) ) {
00021 $server = $wgConf->get( 'wgServer', $wikiID, $major,
00022 array( 'lang' => $minor, 'site' => $major ) );
00023 $path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
00024 array( 'lang' => $minor, 'site' => $major ) );
00025 return new WikiReference( $major, $minor, $server, $path );
00026 } else {
00027 return null;
00028 }
00029 }
00030
00038 public static function getWikiName( $wikiID ) {
00039 $wiki = WikiMap::getWiki( $wikiID );
00040
00041 if ( $wiki ) {
00042 return $wiki->getDisplayName();
00043 }
00044 return $wikiID;
00045 }
00046
00055 public static function foreignUserLink( $wikiID, $user, $text=null ) {
00056 return self::makeForeignLink( $wikiID, "User:$user", $text );
00057 }
00058
00067 public static function makeForeignLink( $wikiID, $page, $text=null ) {
00068 global $wgUser;
00069 $sk = $wgUser->getSkin();
00070
00071 if ( !$text )
00072 $text = $page;
00073
00074 $url = self::getForeignURL( $wikiID, $page );
00075 if ( $url === false )
00076 return false;
00077
00078 return $sk->makeExternalLink( $url, $text );
00079 }
00080
00088 public static function getForeignURL( $wikiID, $page ) {
00089 $wiki = WikiMap::getWiki( $wikiID );
00090
00091 if ( $wiki )
00092 return $wiki->getUrl( $page );
00093
00094 return false;
00095 }
00096 }
00097
00101 class WikiReference {
00102 private $mMinor;
00103 private $mMajor;
00104 private $mServer;
00105 private $mPath;
00106
00107 public function __construct( $major, $minor, $server, $path ) {
00108 $this->mMajor = $major;
00109 $this->mMinor = $minor;
00110 $this->mServer = $server;
00111 $this->mPath = $path;
00112 }
00113
00114 public function getHostname() {
00115 $prefixes = array( 'http://', 'https://' );
00116 foreach ( $prefixes as $prefix ) {
00117 if ( substr( $this->mServer, 0, strlen( $prefix ) ) ) {
00118 return substr( $this->mServer, strlen( $prefix ) );
00119 }
00120 }
00121 throw new MWException( "Invalid hostname for wiki {$this->mMinor}.{$this->mMajor}" );
00122 }
00123
00130 public function getDisplayName() {
00131 $url = $this->getUrl( '' );
00132 $url = preg_replace( '!^https?://!', '', $url );
00133 $url = preg_replace( '!/index\.php(\?title=|/)$!', '/', $url );
00134 $url = preg_replace( '!/wiki/$!', '/', $url );
00135 $url = preg_replace( '!/$!', '', $url );
00136 return $url;
00137 }
00138
00146 private function getLocalUrl( $page ) {
00147 return str_replace( '$1', wfUrlEncode( str_replace( ' ', '_', $page ) ), $this->mPath );
00148 }
00149
00156 public function getUrl( $page ) {
00157 return
00158 $this->mServer .
00159 $this->getLocalUrl( $page );
00160 }
00161 }