Add support for Number grouping(commafy) based on CLDR number grouping patterns like...
[lhc/web/wiklou.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( $major === null ) {
21 return null;
22 }
23 $server = $wgConf->get( 'wgCanonicalServer', $wikiID, $major,
24 array( 'lang' => $minor, 'site' => $major ) );
25 $path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
26 array( 'lang' => $minor, 'site' => $major ) );
27 return new WikiReference( $major, $minor, $server, $path );
28 }
29
30 /**
31 * Convenience to get the wiki's display name
32 *
33 * @todo We can give more info than just the wiki id!
34 * @param $wikiID String: wiki'd id (generally database name)
35 * @return Wiki's name or $wiki_id if the wiki was not found
36 */
37 public static function getWikiName( $wikiID ) {
38 $wiki = WikiMap::getWiki( $wikiID );
39
40 if ( $wiki ) {
41 return $wiki->getDisplayName();
42 }
43 return $wikiID;
44 }
45
46 /**
47 * Convenience to get a link to a user page on a foreign wiki
48 *
49 * @param $wikiID String: wiki'd id (generally database name)
50 * @param $user String: user name (must be normalised before calling this function!)
51 * @param $text String: link's text; optional, default to "User:$user"
52 * @return String: HTML link or false if the wiki was not found
53 */
54 public static function foreignUserLink( $wikiID, $user, $text=null ) {
55 return self::makeForeignLink( $wikiID, "User:$user", $text );
56 }
57
58 /**
59 * Convenience to get a link to a page on a foreign wiki
60 *
61 * @param $wikiID String: wiki'd id (generally database name)
62 * @param $page String: page name (must be normalised before calling this function!)
63 * @param $text String: link's text; optional, default to $page
64 * @return String: HTML link or false if the wiki was not found
65 */
66 public static function makeForeignLink( $wikiID, $page, $text=null ) {
67 if ( !$text ) {
68 $text = $page;
69 }
70
71 $url = self::getForeignURL( $wikiID, $page );
72 if ( $url === false ) {
73 return false;
74 }
75
76 return Linker::makeExternalLink( $url, $text );
77 }
78
79 /**
80 * Convenience to get a url to a page on a foreign wiki
81 *
82 * @param $wikiID String: wiki'd id (generally database name)
83 * @param $page String: page name (must be normalised before calling this function!)
84 * @return String: URL or false if the wiki was not found
85 */
86 public static function getForeignURL( $wikiID, $page ) {
87 $wiki = WikiMap::getWiki( $wikiID );
88
89 if ( $wiki ) {
90 return $wiki->getUrl( $page );
91 }
92
93 return false;
94 }
95 }
96
97 /**
98 * Reference to a locally-hosted wiki
99 */
100 class WikiReference {
101 private $mMinor; ///< 'en', 'meta', 'mediawiki', etc
102 private $mMajor; ///< 'wiki', 'wiktionary', etc
103 private $mServer; ///< server override, 'www.mediawiki.org'
104 private $mPath; ///< path override, '/wiki/$1'
105
106 public function __construct( $major, $minor, $server, $path ) {
107 $this->mMajor = $major;
108 $this->mMinor = $minor;
109 $this->mServer = $server;
110 $this->mPath = $path;
111 }
112
113 public function getHostname() {
114 $prefixes = array( 'http://', 'https://' );
115 foreach ( $prefixes as $prefix ) {
116 if ( substr( $this->mServer, 0, strlen( $prefix ) ) ) {
117 return substr( $this->mServer, strlen( $prefix ) );
118 }
119 }
120 throw new MWException( "Invalid hostname for wiki {$this->mMinor}.{$this->mMajor}" );
121 }
122
123 /**
124 * Get the the URL in a way to de displayed to the user
125 * More or less Wikimedia specific
126 *
127 * @return String
128 */
129 public function getDisplayName() {
130 $url = $this->getUrl( '' );
131 $parsed = wfParseUrl( $url );
132 if ( $parsed ) {
133 return $parsed['host'];
134 } else {
135 // Invalid URL. There's no sane thing to do here, so just return it
136 return $url;
137 }
138 }
139
140 /**
141 * Helper function for getUrl()
142 *
143 * @todo FIXME: This may be generalized...
144 * @param $page String: page name (must be normalised before calling this function!)
145 * @return String: Url fragment
146 */
147 private function getLocalUrl( $page ) {
148 return str_replace( '$1', wfUrlEncode( str_replace( ' ', '_', $page ) ), $this->mPath );
149 }
150
151 /**
152 * Get a URL to a page on this foreign wiki
153 *
154 * @param $page String: page name (must be normalised before calling this function!)
155 * @return String: Url
156 */
157 public function getUrl( $page ) {
158 return
159 $this->mServer .
160 $this->getLocalUrl( $page );
161 }
162 }