X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FWikiMap.php;h=4534414c9f7c7be71df7319b94bf12ff728332cc;hb=e464eff3a4a78652bd8bcb8111f296d738d53b79;hp=6215af16a905ff9ce782775021241d7eada8b233;hpb=8e655d8dd34c9b5b7857532753b4f1faa7d8571d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/WikiMap.php b/includes/WikiMap.php index 6215af16a9..4534414c9f 100644 --- a/includes/WikiMap.php +++ b/includes/WikiMap.php @@ -21,7 +21,7 @@ */ /** - * Helper tools for dealing with other locally-hosted wikis + * Helper tools for dealing with other wikis. */ class WikiMap { @@ -32,6 +32,20 @@ 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(); @@ -41,19 +55,55 @@ class WikiMap { 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 * @@ -171,10 +221,10 @@ class WikiReference { * @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 );