siteLookup = $siteLookup; $this->interwikiMap = $interwikiMap; } /** * See InterwikiLookup::isValidInterwiki * It loads the whole interwiki map. * * @param string $prefix Interwiki prefix to use * @return bool Whether it exists */ public function isValidInterwiki( $prefix ) { return array_key_exists( $prefix, $this->getInterwikiMap() ); } /** * See InterwikiLookup::fetch * It loads the whole interwiki map. * * @param string $prefix Interwiki prefix to use * @return Interwiki|null|bool */ public function fetch( $prefix ) { if ( $prefix == '' ) { return null; } if ( !$this->isValidInterwiki( $prefix ) ) { return false; } return $this->interwikiMap[$prefix]; } /** * See InterwikiLookup::getAllPrefixes * * @param string|null $local If set, limits output to local/non-local interwikis * @return array[] interwiki rows */ public function getAllPrefixes( $local = null ) { $res = []; foreach ( $this->getInterwikiMap() as $interwikiId => $interwiki ) { if ( $local === null || $interwiki->isLocal() === $local ) { $res[] = [ 'iw_prefix' => $interwikiId, 'iw_url' => $interwiki->getURL(), 'iw_api' => $interwiki->getAPI(), 'iw_wikiid' => $interwiki->getWikiID(), 'iw_local' => $interwiki->isLocal(), 'iw_trans' => $interwiki->isTranscludable(), ]; } } return $res; } /** * See InterwikiLookup::invalidateCache * * @param string $prefix */ public function invalidateCache( $prefix ) { if ( !isset( $this->interwikiMap[$prefix] ) ) { return; } $globalId = $this->interwikiMap[$prefix]->getWikiID(); unset( $this->interwikiMap[$prefix] ); // Reload the interwiki $site = $this->siteLookup->getSites()->getSite( $globalId ); $interwikis = $this->getSiteInterwikis( $site ); $this->interwikiMap = array_merge( $this->interwikiMap, [ $interwikis[$prefix] ] ); } /** * Load interwiki map to use as cache */ private function loadInterwikiMap() { $interwikiMap = []; $siteList = $this->siteLookup->getSites(); foreach ( $siteList as $site ) { $interwikis = $this->getSiteInterwikis( $site ); $interwikiMap = array_merge( $interwikiMap, $interwikis ); } $this->interwikiMap = $interwikiMap; } /** * Get interwikiMap attribute, load if needed. * * @return Interwiki[] */ private function getInterwikiMap() { if ( $this->interwikiMap === null ) { $this->loadInterwikiMap(); } return $this->interwikiMap; } /** * Load interwikis for the given site * * @param Site $site * @return Interwiki[] */ private function getSiteInterwikis( Site $site ) { $interwikis = []; foreach ( $site->getInterwikiIds() as $interwiki ) { $url = $site->getPageUrl(); if ( $site instanceof MediaWikiSite ) { $path = $site->getFileUrl( 'api.php' ); } else { $path = ''; } $local = $site->getSource() === 'local'; // TODO: How to adapt trans? $interwikis[$interwiki] = new Interwiki( $interwiki, $url, $path, $site->getGlobalId(), $local ); } return $interwikis; } }