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 }