X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FWikiMap.php;h=325831eef0ab35fc3f037a59c412d077452c8096;hb=49f4f5307a195b8ee6260e7bc63d70777995fda5;hp=7eaebdfcc42b890d72b419570b45a465bde85d3d;hpb=6c67ccee245313a619061952e865445dda584c64;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/WikiMap.php b/includes/WikiMap.php index 7eaebdfcc4..325831eef0 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(); @@ -51,7 +65,43 @@ class WikiMap { $path = $wgConf->get( 'wgArticlePath', $wikiID, $major, array( 'lang' => $minor, 'site' => $major ) ); - return new WikiReference( $major, $minor, $canonicalServer, $path, $server ); + 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 ); } /** @@ -127,22 +177,16 @@ class WikiMap { * Reference to a locally-hosted wiki */ class WikiReference { - private $mMinor; ///< 'en', 'meta', 'mediawiki', etc - private $mMajor; ///< 'wiki', 'wiktionary', etc private $mCanonicalServer; ///< canonical server URL, e.g. 'https://www.mediawiki.org' private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org' private $mPath; ///< path, '/wiki/$1' /** - * @param string $major - * @param string $minor * @param string $canonicalServer * @param string $path * @param null|string $server */ - public function __construct( $major, $minor, $canonicalServer, $path, $server = null ) { - $this->mMajor = $major; - $this->mMinor = $minor; + public function __construct( $canonicalServer, $path, $server = null ) { $this->mCanonicalServer = $canonicalServer; $this->mPath = $path; $this->mServer = $server === null ? $canonicalServer : $server;