]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - includes/WikiMap.php
MediaWiki 1.17.0
[autoinstalls/mediawiki.git] / includes / WikiMap.php
1 <?php
2
3 /**
4  * Helper tools for dealing with other locally-hosted wikis
5  */
6 class WikiMap {
7
8         /**
9          * Get a WikiReference object for $wikiID
10          *
11          * @param $wikiID String: wiki'd id (generally database name)
12          * @return WikiReference object or null if the wiki was not found
13          */
14         public static function getWiki( $wikiID ) {
15                 global $wgConf;
16
17                 $wgConf->loadFullData();
18
19                 list( $major, $minor ) = $wgConf->siteFromDB( $wikiID );
20                 if( isset( $major ) ) {
21                         $server = $wgConf->get( 'wgServer', $wikiID, $major,
22                                 array( 'lang' => $minor, 'site' => $major ) );
23                         $path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
24                                 array( 'lang' => $minor, 'site' => $major ) );
25                         return new WikiReference( $major, $minor, $server, $path );
26                 } else {
27                         return null;
28                 }
29         }
30         
31         /**
32          * Convenience to get the wiki's display name
33          *
34          * @todo We can give more info than just the wiki id!
35          * @param $wikiID String: wiki'd id (generally database name)
36          * @return Wiki's name or $wiki_id if the wiki was not found
37          */
38         public static function getWikiName( $wikiID ) {
39                 $wiki = WikiMap::getWiki( $wikiID );
40
41                 if ( $wiki ) {
42                         return $wiki->getDisplayName();
43                 }
44                 return $wikiID;
45         }
46
47         /**
48          * Convenience to get a link to a user page on a foreign wiki
49          *
50          * @param $wikiID String: wiki'd id (generally database name)
51          * @param $user String: user name (must be normalised before calling this function!)
52          * @param $text String: link's text; optional, default to "User:$user"
53          * @return String: HTML link or false if the wiki was not found
54          */
55         public static function foreignUserLink( $wikiID, $user, $text=null ) {
56                 return self::makeForeignLink( $wikiID, "User:$user", $text );
57         }
58
59         /**
60          * Convenience to get a link to a page on a foreign wiki
61          *
62          * @param $wikiID String: wiki'd id (generally database name)
63          * @param $page String: page name (must be normalised before calling this function!)
64          * @param $text String: link's text; optional, default to $page
65          * @return String: HTML link or false if the wiki was not found
66          */
67         public static function makeForeignLink( $wikiID, $page, $text=null ) {
68                 global $wgUser;
69                 $sk = $wgUser->getSkin();
70
71                 if ( !$text ) {
72                         $text = $page;
73                 }
74
75                 $url = self::getForeignURL( $wikiID, $page );
76                 if ( $url === false ) {
77                         return false;
78                 }
79
80                 return $sk->makeExternalLink( $url, $text );
81         }
82
83         /**
84          * Convenience to get a url to a page on a foreign wiki
85          *
86          * @param $wikiID String: wiki'd id (generally database name)
87          * @param $page String: page name (must be normalised before calling this function!)
88          * @return String: URL or false if the wiki was not found
89          */
90         public static function getForeignURL( $wikiID, $page ) {
91                 $wiki = WikiMap::getWiki( $wikiID );
92                 
93                 if ( $wiki ) {
94                         return $wiki->getUrl( $page );
95                 }
96                         
97                 return false;
98         }
99 }
100
101 /**
102  * Reference to a locally-hosted wiki
103  */
104 class WikiReference {
105         private $mMinor; ///< 'en', 'meta', 'mediawiki', etc
106         private $mMajor; ///< 'wiki', 'wiktionary', etc
107         private $mServer; ///< server override, 'www.mediawiki.org'
108         private $mPath;   ///< path override, '/wiki/$1'
109
110         public function __construct( $major, $minor, $server, $path ) {
111                 $this->mMajor = $major;
112                 $this->mMinor = $minor;
113                 $this->mServer = $server;
114                 $this->mPath = $path;
115         }
116
117         public function getHostname() {
118                 $prefixes = array( 'http://', 'https://' );
119                 foreach ( $prefixes as $prefix ) {
120                         if ( substr( $this->mServer, 0, strlen( $prefix ) ) ) {
121                                 return substr( $this->mServer, strlen( $prefix ) );
122                         }
123                 }
124                 throw new MWException( "Invalid hostname for wiki {$this->mMinor}.{$this->mMajor}" );
125         }
126
127         /**
128          * Get the the URL in a way to de displayed to the user
129          * More or less Wikimedia specific
130          *
131          * @return String
132          */
133         public function getDisplayName() {
134                 $url = $this->getUrl( '' );
135                 $url = preg_replace( '!^https?://!', '', $url );
136                 $url = preg_replace( '!/index\.php(\?title=|/)$!', '/', $url );
137                 $url = preg_replace( '!/wiki/$!', '/', $url );
138                 $url = preg_replace( '!/$!', '', $url );
139                 return $url;
140         }
141
142         /**
143          * Helper function for getUrl()
144          *
145          * @todo FIXME: this may be generalized...
146          * @param $page String: page name (must be normalised before calling this function!)
147          * @return String: Url fragment
148          */
149         private function getLocalUrl( $page ) {
150                 return str_replace( '$1', wfUrlEncode( str_replace( ' ', '_', $page ) ), $this->mPath );
151         }
152
153         /**
154          * Get a URL to a page on this foreign wiki
155          *
156          * @param $page String: page name (must be normalised before calling this function!)
157          * @return String: Url
158          */
159         public function getUrl( $page ) {
160                 return
161                         $this->mServer .
162                         $this->getLocalUrl( $page );
163         }
164 }