*/
/**
- * Helper tools for dealing with other locally-hosted wikis
+ * Helper tools for dealing with other wikis.
*/
class WikiMap {
* @return WikiReference|null WikiReference object or null if the wiki was not found
*/
public static function getWiki( $wikiID ) {
+ $wikiReference = self::getWikiReferenceFromWgConf( $wikiID );
+ if ( $wikiReference ) {
+ return $wikiReference;
+ }
+
+ // Try sites, if $wgConf failed
+ return self::getWikiWikiReferenceFromSites( $wikiID );
+ }
+
+ /**
+ * @param string $wikiID
+ * @return WikiReference|null WikiReference object or null if the wiki was not found
+ */
+ private static function getWikiReferenceFromWgConf( $wikiID ) {
global $wgConf;
$wgConf->loadFullData();
return null;
}
$server = $wgConf->get( 'wgServer', $wikiID, $major,
- array( 'lang' => $minor, 'site' => $major ) );
+ [ 'lang' => $minor, 'site' => $major ] );
$canonicalServer = $wgConf->get( 'wgCanonicalServer', $wikiID, $major,
- array( 'lang' => $minor, 'site' => $major ) );
+ [ 'lang' => $minor, 'site' => $major ] );
if ( $canonicalServer === false || $canonicalServer === null ) {
$canonicalServer = $server;
}
$path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
- array( 'lang' => $minor, 'site' => $major ) );
+ [ 'lang' => $minor, 'site' => $major ] );
return new WikiReference( $canonicalServer, $path, $server );
}
+ /**
+ * @param string $wikiID
+ * @return WikiReference|null WikiReference object or null if the wiki was not found
+ */
+ private static function getWikiWikiReferenceFromSites( $wikiID ) {
+ static $siteStore = null;
+ if ( !$siteStore ) {
+ // Replace once T114471 got fixed and don't do the caching here.
+ $siteStore = SiteSQLStore::newInstance();
+ }
+
+ $site = $siteStore->getSite( $wikiID );
+
+ if ( !$site instanceof MediaWikiSite ) {
+ // Abort if not a MediaWikiSite, as this is about Wikis
+ return null;
+ }
+
+ $urlParts = wfParseUrl( $site->getPageUrl() );
+ if ( $urlParts === false || !isset( $urlParts['path'] ) || !isset( $urlParts['host'] ) ) {
+ // We can't create a meaningful WikiReference without URLs
+ return null;
+ }
+
+ // XXX: Check whether path contains a $1?
+ $path = $urlParts['path'];
+ if ( isset( $urlParts['query'] ) ) {
+ $path .= '?' . $urlParts['query'];
+ }
+
+ $canonicalServer = isset( $urlParts['scheme'] ) ? $urlParts['scheme'] : 'http';
+ $canonicalServer .= '://' . $urlParts['host'];
+
+ return new WikiReference( $canonicalServer, $path );
+ }
+
/**
* Convenience to get the wiki's display name
*
* @return string relative URL, without the server part.
*/
private function getLocalUrl( $page, $fragmentId = null ) {
- $page = wfUrlEncode( str_replace( ' ', '_', $page ) );
+ $page = wfUrlencode( str_replace( ' ', '_', $page ) );
if ( is_string( $fragmentId ) && $fragmentId !== '' ) {
- $page .= '#' . wfUrlEncode( $fragmentId );
+ $page .= '#' . wfUrlencode( $fragmentId );
}
return str_replace( '$1', $page, $this->mPath );