1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2025-06-13 12:54:14 +00:00

Xomw: Add initial Interwiki classes

This commit is contained in:
gnosygnu 2017-03-02 08:41:02 -05:00
parent c60936f165
commit fa9d2d4040
12 changed files with 1383 additions and 156 deletions

View File

@ -15,7 +15,9 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/ */
package gplx.xowa.mediawiki; import gplx.*; import gplx.xowa.*; package gplx.xowa.mediawiki; import gplx.*; import gplx.xowa.*;
import gplx.xowa.mediawiki.includes.*; import gplx.xowa.mediawiki.includes.*;
import gplx.xowa.mediawiki.includes.interwiki.*;
import gplx.xowa.mediawiki.includes.filerepo.file.*; import gplx.xowa.mediawiki.includes.media.*; import gplx.xowa.mediawiki.includes.filerepo.file.*; import gplx.xowa.mediawiki.includes.media.*;
import gplx.xowa.mediawiki.includes.site.*;
import gplx.xowa.mediawiki.languages.*; import gplx.xowa.mediawiki.languages.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.*;
public class XomwEnv { public class XomwEnv {
@ -28,7 +30,9 @@ public class XomwEnv {
public XomwEnv(Xol_lang_itm xoLang) { public XomwEnv(Xol_lang_itm xoLang) {
XomwLanguage language = new XomwLanguage(xoLang); XomwLanguage language = new XomwLanguage(xoLang);
this.mediaWikiServices = new XomwMediaWikiServices(language); XomwFileBasedSiteLookup siteLookup = new XomwFileBasedSiteLookup();
XomwInterwikiLookup interwikiLookup = new XomwInterwikiLookupAdapter(siteLookup);
this.mediaWikiServices = new XomwMediaWikiServices(interwikiLookup, language);
} }
public XomwMagicWordMgr Magic_word_mgr() {return magic_word_mgr;} private final XomwMagicWordMgr magic_word_mgr = new XomwMagicWordMgr(); public XomwMagicWordMgr Magic_word_mgr() {return magic_word_mgr;} private final XomwMagicWordMgr magic_word_mgr = new XomwMagicWordMgr();

View File

@ -15,6 +15,7 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/ */
package gplx.xowa.mediawiki.includes; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*; package gplx.xowa.mediawiki.includes; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*;
import gplx.xowa.mediawiki.languages.*; import gplx.xowa.mediawiki.languages.*;
import gplx.xowa.mediawiki.includes.interwiki.*;
import gplx.xowa.mediawiki.includes.title.*; import gplx.xowa.mediawiki.includes.title.*;
/** /**
* MediaWikiServices is the service locator for the application scope of MediaWiki. * MediaWikiServices is the service locator for the application scope of MediaWiki.
@ -32,9 +33,11 @@ import gplx.xowa.mediawiki.includes.title.*;
public class XomwMediaWikiServices { public class XomwMediaWikiServices {
// XO.MW.SKIP:remove global getInstance(). See XomwEnv // XO.MW.SKIP:remove global getInstance(). See XomwEnv
private final XomwMediaWikiTitleCodec titleParser; private final XomwMediaWikiTitleCodec titleParser;
private final XomwInterwikiLookup interwikiLookup;
public XomwMediaWikiServices(XomwLanguage language) { public XomwMediaWikiServices(XomwInterwikiLookup interwikiLookup, XomwLanguage language) {
this.titleParser = new XomwMediaWikiTitleCodec(language); this.interwikiLookup = interwikiLookup;
this.titleParser = new XomwMediaWikiTitleCodec(this, language);
} }
// /** // /**
@ -132,7 +135,7 @@ public class XomwMediaWikiServices {
// * @param MediaWikiServices $other // * @param MediaWikiServices $other
// */ // */
// private function salvage( self $other ) { // private function salvage( self $other ) {
// foreach ( $this->getServiceNames() as $name ) { // foreach ( this.getServiceNames() as $name ) {
// // The service could be new in the new instance and not registered in the // // The service could be new in the new instance and not registered in the
// // other instance (e.g. an extension that was loaded after the instantiation of // // other instance (e.g. an extension that was loaded after the instantiation of
// // the other instance. Skip this service in this case. See T143974 // // the other instance. Skip this service in this case. See T143974
@ -144,7 +147,7 @@ public class XomwMediaWikiServices {
// //
// if ( $oldService instanceof SalvageableService ) { // if ( $oldService instanceof SalvageableService ) {
// /** @var SalvageableService $newService */ // /** @var SalvageableService $newService */
// $newService = $this->getService( $name ); // $newService = this.getService( $name );
// $newService->salvage( $oldService ); // $newService->salvage( $oldService );
// } // }
// } // }
@ -257,7 +260,7 @@ public class XomwMediaWikiServices {
// throw new MWException( 'resetServiceForTesting() must not be used outside unit tests.' ); // throw new MWException( 'resetServiceForTesting() must not be used outside unit tests.' );
// } // }
// //
// $this->resetService( $name, $destroy ); // this.resetService( $name, $destroy );
// } // }
// //
// /** // /**
@ -307,7 +310,7 @@ public class XomwMediaWikiServices {
// parent::__construct(); // parent::__construct();
// //
// // Register the given Config Object as the bootstrap config service. // // Register the given Config Object as the bootstrap config service.
// $this->defineService( 'BootstrapConfig', function() use ( $config ) { // this.defineService( 'BootstrapConfig', function() use ( $config ) {
// return $config; // return $config;
// } ); // } );
// } // }
@ -328,7 +331,7 @@ public class XomwMediaWikiServices {
// * @return Config // * @return Config
// */ // */
// public function getBootstrapConfig() { // public function getBootstrapConfig() {
// return $this->getService( 'BootstrapConfig' ); // return this.getService( 'BootstrapConfig' );
// } // }
// //
// /** // /**
@ -336,7 +339,7 @@ public class XomwMediaWikiServices {
// * @return ConfigFactory // * @return ConfigFactory
// */ // */
// public function getConfigFactory() { // public function getConfigFactory() {
// return $this->getService( 'ConfigFactory' ); // return this.getService( 'ConfigFactory' );
// } // }
// //
// /** // /**
@ -347,7 +350,7 @@ public class XomwMediaWikiServices {
// * @return Config // * @return Config
// */ // */
// public function getMainConfig() { // public function getMainConfig() {
// return $this->getService( 'MainConfig' ); // return this.getService( 'MainConfig' );
// } // }
// //
// /** // /**
@ -355,7 +358,7 @@ public class XomwMediaWikiServices {
// * @return SiteLookup // * @return SiteLookup
// */ // */
// public function getSiteLookup() { // public function getSiteLookup() {
// return $this->getService( 'SiteLookup' ); // return this.getService( 'SiteLookup' );
// } // }
// //
// /** // /**
@ -363,23 +366,23 @@ public class XomwMediaWikiServices {
// * @return SiteStore // * @return SiteStore
// */ // */
// public function getSiteStore() { // public function getSiteStore() {
// return $this->getService( 'SiteStore' ); // return this.getService( 'SiteStore' );
// } // }
//
// /** /**
// * @since 1.28 * @since 1.28
// * @return InterwikiLookup * @return InterwikiLookup
// */ */
// public function getInterwikiLookup() { public XomwInterwikiLookup getInterwikiLookup() {
// return $this->getService( 'InterwikiLookup' ); return interwikiLookup;
// } }
//
// /** // /**
// * @since 1.27 // * @since 1.27
// * @return StatsdDataFactory // * @return StatsdDataFactory
// */ // */
// public function getStatsdDataFactory() { // public function getStatsdDataFactory() {
// return $this->getService( 'StatsdDataFactory' ); // return this.getService( 'StatsdDataFactory' );
// } // }
// //
// /** // /**
@ -387,7 +390,7 @@ public class XomwMediaWikiServices {
// * @return EventRelayerGroup // * @return EventRelayerGroup
// */ // */
// public function getEventRelayerGroup() { // public function getEventRelayerGroup() {
// return $this->getService( 'EventRelayerGroup' ); // return this.getService( 'EventRelayerGroup' );
// } // }
// //
// /** // /**
@ -396,7 +399,7 @@ public class XomwMediaWikiServices {
// */ // */
// public function newSearchEngine() { // public function newSearchEngine() {
// // New engine Object every time, since they keep state // // New engine Object every time, since they keep state
// return $this->getService( 'SearchEngineFactory' )->create(); // return this.getService( 'SearchEngineFactory' )->create();
// } // }
// //
// /** // /**
@ -404,7 +407,7 @@ public class XomwMediaWikiServices {
// * @return SearchEngineFactory // * @return SearchEngineFactory
// */ // */
// public function getSearchEngineFactory() { // public function getSearchEngineFactory() {
// return $this->getService( 'SearchEngineFactory' ); // return this.getService( 'SearchEngineFactory' );
// } // }
// //
// /** // /**
@ -412,7 +415,7 @@ public class XomwMediaWikiServices {
// * @return SearchEngineConfig // * @return SearchEngineConfig
// */ // */
// public function getSearchEngineConfig() { // public function getSearchEngineConfig() {
// return $this->getService( 'SearchEngineConfig' ); // return this.getService( 'SearchEngineConfig' );
// } // }
// //
// /** // /**
@ -420,7 +423,7 @@ public class XomwMediaWikiServices {
// * @return SkinFactory // * @return SkinFactory
// */ // */
// public function getSkinFactory() { // public function getSkinFactory() {
// return $this->getService( 'SkinFactory' ); // return this.getService( 'SkinFactory' );
// } // }
// //
// /** // /**
@ -428,7 +431,7 @@ public class XomwMediaWikiServices {
// * @return LBFactory // * @return LBFactory
// */ // */
// public function getDBLoadBalancerFactory() { // public function getDBLoadBalancerFactory() {
// return $this->getService( 'DBLoadBalancerFactory' ); // return this.getService( 'DBLoadBalancerFactory' );
// } // }
// //
// /** // /**
@ -436,7 +439,7 @@ public class XomwMediaWikiServices {
// * @return LoadBalancer The main DB load balancer for the local wiki. // * @return LoadBalancer The main DB load balancer for the local wiki.
// */ // */
// public function getDBLoadBalancer() { // public function getDBLoadBalancer() {
// return $this->getService( 'DBLoadBalancer' ); // return this.getService( 'DBLoadBalancer' );
// } // }
// //
// /** // /**
@ -444,7 +447,7 @@ public class XomwMediaWikiServices {
// * @return WatchedItemStore // * @return WatchedItemStore
// */ // */
// public function getWatchedItemStore() { // public function getWatchedItemStore() {
// return $this->getService( 'WatchedItemStore' ); // return this.getService( 'WatchedItemStore' );
// } // }
// //
// /** // /**
@ -452,7 +455,7 @@ public class XomwMediaWikiServices {
// * @return WatchedItemQueryService // * @return WatchedItemQueryService
// */ // */
// public function getWatchedItemQueryService() { // public function getWatchedItemQueryService() {
// return $this->getService( 'WatchedItemQueryService' ); // return this.getService( 'WatchedItemQueryService' );
// } // }
// //
// /** // /**
@ -460,7 +463,7 @@ public class XomwMediaWikiServices {
// * @return CryptRand // * @return CryptRand
// */ // */
// public function getCryptRand() { // public function getCryptRand() {
// return $this->getService( 'CryptRand' ); // return this.getService( 'CryptRand' );
// } // }
// //
// /** // /**
@ -468,7 +471,7 @@ public class XomwMediaWikiServices {
// * @return CryptHKDF // * @return CryptHKDF
// */ // */
// public function getCryptHKDF() { // public function getCryptHKDF() {
// return $this->getService( 'CryptHKDF' ); // return this.getService( 'CryptHKDF' );
// } // }
// //
// /** // /**
@ -476,7 +479,7 @@ public class XomwMediaWikiServices {
// * @return MediaHandlerFactory // * @return MediaHandlerFactory
// */ // */
// public function getMediaHandlerFactory() { // public function getMediaHandlerFactory() {
// return $this->getService( 'MediaHandlerFactory' ); // return this.getService( 'MediaHandlerFactory' );
// } // }
// //
// /** // /**
@ -484,7 +487,7 @@ public class XomwMediaWikiServices {
// * @return MimeAnalyzer // * @return MimeAnalyzer
// */ // */
// public function getMimeAnalyzer() { // public function getMimeAnalyzer() {
// return $this->getService( 'MimeAnalyzer' ); // return this.getService( 'MimeAnalyzer' );
// } // }
// //
// /** // /**
@ -492,7 +495,7 @@ public class XomwMediaWikiServices {
// * @return ProxyLookup // * @return ProxyLookup
// */ // */
// public function getProxyLookup() { // public function getProxyLookup() {
// return $this->getService( 'ProxyLookup' ); // return this.getService( 'ProxyLookup' );
// } // }
// //
// /** // /**
@ -500,7 +503,7 @@ public class XomwMediaWikiServices {
// * @return Parser // * @return Parser
// */ // */
// public function getParser() { // public function getParser() {
// return $this->getService( 'Parser' ); // return this.getService( 'Parser' );
// } // }
// //
// /** // /**
@ -508,7 +511,7 @@ public class XomwMediaWikiServices {
// * @return GenderCache // * @return GenderCache
// */ // */
// public function getGenderCache() { // public function getGenderCache() {
// return $this->getService( 'GenderCache' ); // return this.getService( 'GenderCache' );
// } // }
// //
// /** // /**
@ -516,7 +519,7 @@ public class XomwMediaWikiServices {
// * @return LinkCache // * @return LinkCache
// */ // */
// public function getLinkCache() { // public function getLinkCache() {
// return $this->getService( 'LinkCache' ); // return this.getService( 'LinkCache' );
// } // }
// //
// /** // /**
@ -524,7 +527,7 @@ public class XomwMediaWikiServices {
// * @return LinkRendererFactory // * @return LinkRendererFactory
// */ // */
// public function getLinkRendererFactory() { // public function getLinkRendererFactory() {
// return $this->getService( 'LinkRendererFactory' ); // return this.getService( 'LinkRendererFactory' );
// } // }
// //
// /** // /**
@ -535,7 +538,7 @@ public class XomwMediaWikiServices {
// * @return LinkRenderer // * @return LinkRenderer
// */ // */
// public function getLinkRenderer() { // public function getLinkRenderer() {
// return $this->getService( 'LinkRenderer' ); // return this.getService( 'LinkRenderer' );
// } // }
/** /**
@ -543,7 +546,7 @@ public class XomwMediaWikiServices {
* @return TitleFormatter * @return TitleFormatter
*/ */
public XomwMediaWikiTitleCodec getTitleFormatter() { public XomwMediaWikiTitleCodec getTitleFormatter() {
// return $this->getService( 'TitleFormatter' ); // return this.getService( 'TitleFormatter' );
return titleParser; return titleParser;
} }
@ -552,7 +555,7 @@ public class XomwMediaWikiServices {
* @return TitleParser * @return TitleParser
*/ */
public XomwMediaWikiTitleCodec getTitleParser() { public XomwMediaWikiTitleCodec getTitleParser() {
// return $this->getService( 'TitleParser' ); // return this.getService( 'TitleParser' );
return titleParser; return titleParser;
} }
@ -561,7 +564,7 @@ public class XomwMediaWikiServices {
// * @return \BagOStuff // * @return \BagOStuff
// */ // */
// public function getMainObjectStash() { // public function getMainObjectStash() {
// return $this->getService( 'MainObjectStash' ); // return this.getService( 'MainObjectStash' );
// } // }
// //
// /** // /**
@ -569,7 +572,7 @@ public class XomwMediaWikiServices {
// * @return \WANObjectCache // * @return \WANObjectCache
// */ // */
// public function getMainWANObjectCache() { // public function getMainWANObjectCache() {
// return $this->getService( 'MainWANObjectCache' ); // return this.getService( 'MainWANObjectCache' );
// } // }
// //
// /** // /**
@ -577,7 +580,7 @@ public class XomwMediaWikiServices {
// * @return \BagOStuff // * @return \BagOStuff
// */ // */
// public function getLocalServerObjectCache() { // public function getLocalServerObjectCache() {
// return $this->getService( 'LocalServerObjectCache' ); // return this.getService( 'LocalServerObjectCache' );
// } // }
// //
// /** // /**
@ -585,7 +588,7 @@ public class XomwMediaWikiServices {
// * @return VirtualRESTServiceClient // * @return VirtualRESTServiceClient
// */ // */
// public function getVirtualRESTServiceClient() { // public function getVirtualRESTServiceClient() {
// return $this->getService( 'VirtualRESTServiceClient' ); // return this.getService( 'VirtualRESTServiceClient' );
// } // }
// //
// /////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////

View File

@ -48,18 +48,19 @@ public class XomwInterwiki {
this.mTrans = trans; this.mTrans = trans;
} }
// /** /**
// * Check whether an interwiki prefix exists * Check whether an interwiki prefix exists
// * *
// * @deprecated since 1.28, use InterwikiLookup instead * [@]deprecated since 1.28, use InterwikiLookup instead
// * *
// * @param String prefix Interwiki prefix to use * @param String prefix Interwiki prefix to use
// * @return boolean Whether it exists * @return boolean Whether it exists
// */ */
// public static function isValidInterwiki(prefix) { public static boolean isValidInterwiki(XomwMediaWikiServices mws, byte[] prefix) {
return mws.getInterwikiLookup().isValidInterwiki(prefix);
// return MediaWikiServices::getInstance().getInterwikiLookup().isValidInterwiki(prefix); // return MediaWikiServices::getInstance().getInterwikiLookup().isValidInterwiki(prefix);
// } }
//
// /** // /**
// * Fetch an Interwiki Object // * Fetch an Interwiki Object
// * // *

View File

@ -28,25 +28,25 @@ public interface XomwInterwikiLookup {
*/ */
boolean isValidInterwiki(byte[] prefix); boolean isValidInterwiki(byte[] prefix);
/** // /**
* Fetch an Interwiki Object // * Fetch an Interwiki Object
* // *
* @param String $prefix Interwiki prefix to use // * @param String $prefix Interwiki prefix to use
* @return Interwiki|null|boolean // * @return Interwiki|null|boolean
*/ // */
XomwInterwiki fetch(byte[] prefix); // XomwInterwiki fetch(byte[] prefix);
//
/** // /**
* Returns all interwiki prefixes // * Returns all interwiki prefixes
* // *
* @param String|null $local If set, limits output to local/non-local interwikis // * @param String|null $local If set, limits output to local/non-local interwikis
* @return String[] List of prefixes // * @return String[] List of prefixes
*/ // */
byte[][] getAllPrefixes(byte[] local); // byte[][] getAllPrefixes(byte[] local);
//
/** // /**
* Purge the in-process and persistent Object cache for an interwiki prefix // * Purge the in-process and persistent Object cache for an interwiki prefix
* @param String $prefix // * @param String $prefix
*/ // */
void invalidateCache(byte[] prefix); // void invalidateCache(byte[] prefix);
} }

View File

@ -14,37 +14,38 @@ GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/ */
package gplx.xowa.mediawiki.includes.interwiki; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*; import gplx.xowa.mediawiki.includes.*; package gplx.xowa.mediawiki.includes.interwiki; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*; import gplx.xowa.mediawiki.includes.*;
class XomwInterwikiLookupAdapter { import gplx.xowa.mediawiki.includes.site.*;
// /** public class XomwInterwikiLookupAdapter implements XomwInterwikiLookup {
// * @var SiteLookup /**
// */ * @var SiteLookup
// private $siteLookup; */
// // private final XomwSiteLookup siteLookup;
// /** // /**
// * @var Interwiki[]|null associative array mapping interwiki prefixes to Interwiki objects // * @var Interwiki[]|null associative array mapping interwiki prefixes to Interwiki objects
// */ // */
// private $interwikiMap; // private $interwikiMap;
//
// function __construct( public XomwInterwikiLookupAdapter(
// SiteLookup $siteLookup, XomwSiteLookup siteLookup //,
// array $interwikiMap = null // array $interwikiMap = null
// ) { ) {
// $this->siteLookup = $siteLookup; // this.siteLookup = siteLookup;
// $this->interwikiMap = $interwikiMap; // this.interwikiMap = $interwikiMap;
// } }
//
// /** /**
// * See InterwikiLookup::isValidInterwiki * See InterwikiLookup::isValidInterwiki
// * It loads the whole interwiki map. * It loads the whole interwiki map.
// * *
// * @param String $prefix Interwiki prefix to use * @param String $prefix Interwiki prefix to use
// * @return boolean Whether it exists * @return boolean Whether it exists
// */ */
// public function isValidInterwiki( $prefix ) { public boolean isValidInterwiki(byte[] prefix) {
// return false;
// return array_key_exists( $prefix, $this->getInterwikiMap() ); // return array_key_exists($prefix, this.getInterwikiMap());
// } }
//
// /** // /**
// * See InterwikiLookup::fetch // * See InterwikiLookup::fetch
// * It loads the whole interwiki map. // * It loads the whole interwiki map.
@ -52,16 +53,16 @@ class XomwInterwikiLookupAdapter {
// * @param String $prefix Interwiki prefix to use // * @param String $prefix Interwiki prefix to use
// * @return Interwiki|null|boolean // * @return Interwiki|null|boolean
// */ // */
// public function fetch( $prefix ) { // public function fetch($prefix) {
// if ( $prefix == '' ) { // if ($prefix == '') {
// return null; // return null;
// } // }
// //
// if ( !$this->isValidInterwiki( $prefix ) ) { // if (!this.isValidInterwiki($prefix)) {
// return false; // return false;
// } // }
// //
// return $this->interwikiMap[$prefix]; // return this.interwikiMap[$prefix];
// } // }
// //
// /** // /**
@ -70,13 +71,13 @@ class XomwInterwikiLookupAdapter {
// * @param String|null $local If set, limits output to local/non-local interwikis // * @param String|null $local If set, limits output to local/non-local interwikis
// * @return String[] List of prefixes // * @return String[] List of prefixes
// */ // */
// public function getAllPrefixes( $local = null ) { // public function getAllPrefixes($local = null) {
// if ( $local === null ) { // if ($local === null) {
// return array_keys( $this->getInterwikiMap() ); // return array_keys(this.getInterwikiMap());
// } // }
// $res = []; // $res = [];
// foreach ( $this->getInterwikiMap() as $interwikiId => $interwiki ) { // foreach (this.getInterwikiMap() as $interwikiId => $interwiki) {
// if ( $interwiki->isLocal() === $local ) { // if ($interwiki->isLocal() === $local) {
// $res[] = $interwikiId; // $res[] = $interwikiId;
// } // }
// } // }
@ -88,56 +89,60 @@ class XomwInterwikiLookupAdapter {
// * // *
// * @param String $prefix // * @param String $prefix
// */ // */
// public function invalidateCache( $prefix ) { // public function invalidateCache($prefix) {
// if ( !isset( $this->interwikiMap[$prefix] ) ) { // if (!isset(this.interwikiMap[$prefix])) {
// return; // return;
// } // }
// $globalId = $this->interwikiMap[$prefix]->getWikiID(); // $globalId = this.interwikiMap[$prefix]->getWikiID();
// unset( $this->interwikiMap[$prefix] ); // unset(this.interwikiMap[$prefix]);
// //
// // Reload the interwiki // // Reload the interwiki
// $site = $this->siteLookup->getSites()->getSite( $globalId ); // $site = this.siteLookup->getSites()->getSite($globalId);
// $interwikis = $this->getSiteInterwikis( $site ); // $interwikis = this.getSiteInterwikis($site);
// $this->interwikiMap = array_merge( $this->interwikiMap, [ $interwikis[$prefix] ] ); // this.interwikiMap = array_merge(this.interwikiMap, [ $interwikis[$prefix] ]);
// } // }
//
// /** /**
// * Load interwiki map to use as cache * Load interwiki map to use as cache
// */ */
// private function loadInterwikiMap() { // private Object loadInterwikiMap() {
// $interwikiMap = []; //// $interwikiMap = [];
// $siteList = $this->siteLookup->getSites(); // XomwSiteList siteList = this.siteLookup.getSites();
// foreach ( $siteList as $site ) { // int len = siteList.Len();
// $interwikis = $this->getSiteInterwikis( $site ); // for (int i = 0; i < len; i++) {
// $interwikiMap = array_merge( $interwikiMap, $interwikis ); // XomwSite site = siteList.GetAt(i);
//// $interwikis = this.getSiteInterwikis($site);
//// $interwikiMap = array_merge($interwikiMap, $interwikis);
// } // }
// $this->interwikiMap = $interwikiMap; //// this.interwikiMap = $interwikiMap;
// return null;
// } // }
//
// /** /**
// * Get interwikiMap attribute, load if needed. * Get interwikiMap attribute, load if needed.
// * *
// * @return Interwiki[] * @return Interwiki[]
// */ */
// private function getInterwikiMap() { // private Object getInterwikiMap() {
// if ( $this->interwikiMap === null ) { // if (this.interwikiMap === null) {
// $this->loadInterwikiMap(); // this.loadInterwikiMap();
// } // }
// return $this->interwikiMap; // return this.interwikiMap;
// return null;
// } // }
//
// /** // /**
// * Load interwikis for the given site // * Load interwikis for the given site
// * // *
// * @param Site $site // * @param Site $site
// * @return Interwiki[] // * @return Interwiki[]
// */ // */
// private function getSiteInterwikis( Site $site ) { // private function getSiteInterwikis(Site $site) {
// $interwikis = []; // $interwikis = [];
// foreach ( $site->getInterwikiIds() as $interwiki ) { // foreach ($site->getInterwikiIds() as $interwiki) {
// $url = $site->getPageUrl(); // $url = $site->getPageUrl();
// if ( $site instanceof MediaWikiSite ) { // if ($site instanceof MediaWikiSite) {
// $path = $site->getFileUrl( 'api.php' ); // $path = $site->getFileUrl('api.php');
// } else { // } else {
// $path = ''; // $path = '';
// } // }

View File

@ -0,0 +1,132 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.mediawiki.includes.site; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*; import gplx.xowa.mediawiki.includes.*;
/**
* Provides a file-based cache of a SiteStore. The sites are stored in
* a json file. (see docs/sitescache.txt regarding format)
*
* The cache can be built with the rebuildSitesCache.php maintenance script,
* and a MediaWiki instance can be setup to use this by setting the
* 'wgSitesCacheFile' configuration to the cache file location.
*
* @since 1.25
*/
public class XomwFileBasedSiteLookup implements XomwSiteLookup {
/**
* @var SiteList
*/
private XomwSiteList sites = null;
// /**
// * @var String
// */
// private $cacheFile;
//
// /**
// * @param String $cacheFile
// */
// public function __construct($cacheFile) {
// this.cacheFile = $cacheFile;
// }
/**
* @since 1.25
*
* @return SiteList
*/
public XomwSiteList getSites() {
// if (this.sites === null) {
// this.sites = this.loadSitesFromCache();
// }
return this.sites;
}
/**
* @param String $globalId
*
* @since 1.25
*
* @return Site|null
*/
public XomwSite getSite(byte[] globalId) {
// $sites = this.getSites();
//
// return $sites->hasSite($globalId) ? $sites->getSite($globalId) : null;
return null;
}
// /**
// * @return SiteList
// */
// private function loadSitesFromCache() {
// $data = this.loadJsonFile();
//
// $sites = new SiteList();
//
// // @todo lazy initialize the site objects in the site list (e.g. only when needed to access)
// foreach ($data['sites'] as $siteArray) {
// $sites[] = this.newSiteFromArray($siteArray);
// }
//
// return $sites;
// }
//
// /**
// * @throws MWException
// * @return array see docs/sitescache.txt for format of the array.
// */
// private function loadJsonFile() {
// if (!is_readable(this.cacheFile)) {
// throw new MWException('SiteList cache file not found.');
// }
//
// $contents = file_get_contents(this.cacheFile);
// $data = json_decode($contents, true);
//
// if (!is_array($data) || !is_array($data['sites'])
// || !array_key_exists('sites', $data)
// ) {
// throw new MWException('SiteStore json cache data is invalid.');
// }
//
// return $data;
// }
//
// /**
// * @param array $data
// *
// * @return Site
// */
// private function newSiteFromArray(array $data) {
// $siteType = array_key_exists('type', $data) ? $data['type'] : Site::TYPE_UNKNOWN;
// $site = Site::newForType($siteType);
//
// $site->setGlobalId($data['globalid']);
// $site->setForward($data['forward']);
// $site->setGroup($data['group']);
// $site->setLanguageCode($data['language']);
// $site->setSource($data['source']);
// $site->setExtraData($data['data']);
// $site->setExtraConfig($data['config']);
//
// foreach ($data['identifiers'] as $identifier) {
// $site->addLocalId($identifier['type'], $identifier['key']);
// }
//
// return $site;
// }
}

View File

@ -0,0 +1,691 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.mediawiki.includes.site; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*; import gplx.xowa.mediawiki.includes.*;
/**
* Represents a single site.
*/
public class XomwSite {
// static final TYPE_UNKNOWN = 'unknown';
// static final TYPE_MEDIAWIKI = 'mediawiki';
//
// static final GROUP_NONE = 'none';
//
// static final ID_INTERWIKI = 'interwiki';
// static final ID_EQUIVALENT = 'equivalent';
//
// static final SOURCE_LOCAL = 'local';
//
// static final PATH_LINK = 'link';
//
// /**
// * A version ID that identifies the serialization structure used by getSerializationData()
// * and unserialize(). This is useful for constructing cache keys in cases where the cache relies
// * on serialization for storing the SiteList.
// *
// * @var String A String uniquely identifying the version of the serialization structure.
// */
// static final SERIAL_VERSION_ID = '2013-01-23';
//
// /**
// * @since 1.21
// *
// * @var String|null
// */
// protected $globalId = null;
//
// /**
// * @since 1.21
// *
// * @var String
// */
// protected $type = self::TYPE_UNKNOWN;
//
// /**
// * @since 1.21
// *
// * @var String
// */
// protected $group = self::GROUP_NONE;
//
// /**
// * @since 1.21
// *
// * @var String
// */
// protected $source = self::SOURCE_LOCAL;
//
// /**
// * @since 1.21
// *
// * @var String|null
// */
// protected $languageCode = null;
//
// /**
// * Holds the local ids for this site.
// * local id type => [ ids for this type (strings) ]
// *
// * @since 1.21
// *
// * @var array[]
// */
// protected $localIds = [];
//
// /**
// * @since 1.21
// *
// * @var array
// */
// protected $extraData = [];
//
// /**
// * @since 1.21
// *
// * @var array
// */
// protected $extraConfig = [];
//
// /**
// * @since 1.21
// *
// * @var boolean
// */
// protected $forward = false;
//
// /**
// * @since 1.21
// *
// * @var int|null
// */
// protected $internalId = null;
//
// /**
// * Constructor.
// *
// * @since 1.21
// *
// * @param String $type
// */
// public function __construct( $type = self::TYPE_UNKNOWN ) {
// $this->type = $type;
// }
//
// /**
// * Returns the global site identifier (ie enwiktionary).
// *
// * @since 1.21
// *
// * @return String|null
// */
// public function getGlobalId() {
// return $this->globalId;
// }
//
// /**
// * Sets the global site identifier (ie enwiktionary).
// *
// * @since 1.21
// *
// * @param String|null $globalId
// *
// * @throws MWException
// */
// public function setGlobalId( $globalId ) {
// if ( $globalId !== null && !is_string( $globalId ) ) {
// throw new MWException( '$globalId needs to be String or null' );
// }
//
// $this->globalId = $globalId;
// }
//
// /**
// * Returns the type of the site (ie mediawiki).
// *
// * @since 1.21
// *
// * @return String
// */
// public function getType() {
// return $this->type;
// }
//
// /**
// * Gets the group of the site (ie wikipedia).
// *
// * @since 1.21
// *
// * @return String
// */
// public function getGroup() {
// return $this->group;
// }
//
// /**
// * Sets the group of the site (ie wikipedia).
// *
// * @since 1.21
// *
// * @param String $group
// *
// * @throws MWException
// */
// public function setGroup( $group ) {
// if ( !is_string( $group ) ) {
// throw new MWException( '$group needs to be a String' );
// }
//
// $this->group = $group;
// }
//
// /**
// * Returns the source of the site data (ie 'local', 'wikidata', 'my-magical-repo').
// *
// * @since 1.21
// *
// * @return String
// */
// public function getSource() {
// return $this->source;
// }
//
// /**
// * Sets the source of the site data (ie 'local', 'wikidata', 'my-magical-repo').
// *
// * @since 1.21
// *
// * @param String $source
// *
// * @throws MWException
// */
// public function setSource( $source ) {
// if ( !is_string( $source ) ) {
// throw new MWException( '$source needs to be a String' );
// }
//
// $this->source = $source;
// }
//
// /**
// * Gets if site.tld/path/key:pageTitle should forward users to the page on
// * the actual site, where "key" is the local identifier.
// *
// * @since 1.21
// *
// * @return boolean
// */
// public function shouldForward() {
// return $this->forward;
// }
//
// /**
// * Sets if site.tld/path/key:pageTitle should forward users to the page on
// * the actual site, where "key" is the local identifier.
// *
// * @since 1.21
// *
// * @param boolean $shouldForward
// *
// * @throws MWException
// */
// public function setForward( $shouldForward ) {
// if ( !is_bool( $shouldForward ) ) {
// throw new MWException( '$shouldForward needs to be a boolean' );
// }
//
// $this->forward = $shouldForward;
// }
//
// /**
// * Returns the domain of the site, ie en.wikipedia.org
// * Or false if it's not known.
// *
// * @since 1.21
// *
// * @return String|null
// */
// public function getDomain() {
// $path = $this->getLinkPath();
//
// if ( $path === null ) {
// return null;
// }
//
// return parse_url( $path, PHP_URL_HOST );
// }
//
// /**
// * Returns the protocol of the site.
// *
// * @since 1.21
// *
// * @throws MWException
// * @return String
// */
// public function getProtocol() {
// $path = $this->getLinkPath();
//
// if ( $path === null ) {
// return '';
// }
//
// $protocol = parse_url( $path, PHP_URL_SCHEME );
//
// // Malformed URL
// if ( $protocol === false ) {
// throw new MWException( "failed to parse URL '$path'" );
// }
//
// // No schema
// if ( $protocol === null ) {
// // Used for protocol relative URLs
// $protocol = '';
// }
//
// return $protocol;
// }
//
// /**
// * Sets the path used to construct links with.
// * Shall be equivalent to setPath( getLinkPathType(), $fullUrl ).
// *
// * @param String $fullUrl
// *
// * @since 1.21
// *
// * @throws MWException
// */
// public function setLinkPath( $fullUrl ) {
// $type = $this->getLinkPathType();
//
// if ( $type === null ) {
// throw new MWException( "This Site does not support link paths." );
// }
//
// $this->setPath( $type, $fullUrl );
// }
//
// /**
// * Returns the path used to construct links with or false if there is no such path.
// *
// * Shall be equivalent to getPath( getLinkPathType() ).
// *
// * @return String|null
// */
// public function getLinkPath() {
// $type = $this->getLinkPathType();
// return $type === null ? null: $this->getPath( $type );
// }
//
// /**
// * Returns the main path type, that is the type of the path that should
// * generally be used to construct links to the target site.
// *
// * This default implementation returns Site::PATH_LINK as the default path
// * type. Subclasses can override this to define a different default path
// * type, or return false to disable site links.
// *
// * @since 1.21
// *
// * @return String|null
// */
// public function getLinkPathType() {
// return self::PATH_LINK;
// }
//
// /**
// * Returns the full URL for the given page on the site.
// * Or false if the needed information is not known.
// *
// * This generated URL is usually based upon the path returned by getLinkPath(),
// * but this is not a requirement.
// *
// * This implementation returns a URL constructed using the path returned by getLinkPath().
// *
// * @since 1.21
// *
// * @param boolean|String $pageName
// *
// * @return String|boolean
// */
// public function getPageUrl( $pageName = false ) {
// $url = $this->getLinkPath();
//
// if ( $url === false ) {
// return false;
// }
//
// if ( $pageName !== false ) {
// $url = str_replace( '$1', rawurlencode( $pageName ), $url );
// }
//
// return $url;
// }
//
// /**
// * Returns $pageName without changes.
// * Subclasses may override this to apply some kind of normalization.
// *
// * @see Site::normalizePageName
// *
// * @since 1.21
// *
// * @param String $pageName
// *
// * @return String
// */
// public function normalizePageName( $pageName ) {
// return $pageName;
// }
//
// /**
// * Returns the type specific fields.
// *
// * @since 1.21
// *
// * @return array
// */
// public function getExtraData() {
// return $this->extraData;
// }
//
// /**
// * Sets the type specific fields.
// *
// * @since 1.21
// *
// * @param array $extraData
// */
// public function setExtraData( array $extraData ) {
// $this->extraData = $extraData;
// }
//
// /**
// * Returns the type specific config.
// *
// * @since 1.21
// *
// * @return array
// */
// public function getExtraConfig() {
// return $this->extraConfig;
// }
//
// /**
// * Sets the type specific config.
// *
// * @since 1.21
// *
// * @param array $extraConfig
// */
// public function setExtraConfig( array $extraConfig ) {
// $this->extraConfig = $extraConfig;
// }
//
// /**
// * Returns language code of the sites primary language.
// * Or null if it's not known.
// *
// * @since 1.21
// *
// * @return String|null
// */
// public function getLanguageCode() {
// return $this->languageCode;
// }
//
// /**
// * Sets language code of the sites primary language.
// *
// * @since 1.21
// *
// * @param String $languageCode
// */
// public function setLanguageCode( $languageCode ) {
// $this->languageCode = $languageCode;
// }
//
// /**
// * Returns the set @gplx.Internal protected identifier for the site.
// *
// * @since 1.21
// *
// * @return String|null
// */
// public function getInternalId() {
// return $this->internalId;
// }
//
// /**
// * Sets the @gplx.Internal protected identifier for the site.
// * This typically is a primary key in a db table.
// *
// * @since 1.21
// *
// * @param int|null $internalId
// */
// public function setInternalId( $internalId = null ) {
// $this->internalId = $internalId;
// }
//
// /**
// * Adds a local identifier.
// *
// * @since 1.21
// *
// * @param String $type
// * @param String $identifier
// */
// public function addLocalId( $type, $identifier ) {
// if ( $this->localIds === false ) {
// $this->localIds = [];
// }
//
// if ( !array_key_exists( $type, $this->localIds ) ) {
// $this->localIds[$type] = [];
// }
//
// if ( !in_array( $identifier, $this->localIds[$type] ) ) {
// $this->localIds[$type][] = $identifier;
// }
// }
//
// /**
// * Adds an interwiki id to the site.
// *
// * @since 1.21
// *
// * @param String $identifier
// */
// public function addInterwikiId( $identifier ) {
// $this->addLocalId( self::ID_INTERWIKI, $identifier );
// }
//
// /**
// * Adds a navigation id to the site.
// *
// * @since 1.21
// *
// * @param String $identifier
// */
// public function addNavigationId( $identifier ) {
// $this->addLocalId( self::ID_EQUIVALENT, $identifier );
// }
//
// /**
// * Returns the interwiki link identifiers that can be used for this site.
// *
// * @since 1.21
// *
// * @return String[]
// */
// public function getInterwikiIds() {
// return array_key_exists( self::ID_INTERWIKI, $this->localIds )
// ? $this->localIds[self::ID_INTERWIKI]
// : [];
// }
//
// /**
// * Returns the equivalent link identifiers that can be used to make
// * the site show up in interfaces such as the "language links" section.
// *
// * @since 1.21
// *
// * @return String[]
// */
// public function getNavigationIds() {
// return array_key_exists( self::ID_EQUIVALENT, $this->localIds )
// ? $this->localIds[self::ID_EQUIVALENT] :
// [];
// }
//
// /**
// * Returns all local ids
// *
// * @since 1.21
// *
// * @return array[]
// */
// public function getLocalIds() {
// return $this->localIds;
// }
//
// /**
// * Sets the path used to construct links with.
// * Shall be equivalent to setPath( getLinkPathType(), $fullUrl ).
// *
// * @since 1.21
// *
// * @param String $pathType
// * @param String $fullUrl
// *
// * @throws MWException
// */
// public function setPath( $pathType, $fullUrl ) {
// if ( !is_string( $fullUrl ) ) {
// throw new MWException( '$fullUrl needs to be a String' );
// }
//
// if ( !array_key_exists( 'paths', $this->extraData ) ) {
// $this->extraData['paths'] = [];
// }
//
// $this->extraData['paths'][$pathType] = $fullUrl;
// }
//
// /**
// * Returns the path of the provided type or false if there is no such path.
// *
// * @since 1.21
// *
// * @param String $pathType
// *
// * @return String|null
// */
// public function getPath( $pathType ) {
// $paths = $this->getAllPaths();
// return array_key_exists( $pathType, $paths ) ? $paths[$pathType] : null;
// }
//
// /**
// * Returns the paths as associative array.
// * The keys are path types, the values are the path urls.
// *
// * @since 1.21
// *
// * @return String[]
// */
// public function getAllPaths() {
// return array_key_exists( 'paths', $this->extraData ) ? $this->extraData['paths'] : [];
// }
//
// /**
// * Removes the path of the provided type if it's set.
// *
// * @since 1.21
// *
// * @param String $pathType
// */
// public function removePath( $pathType ) {
// if ( array_key_exists( 'paths', $this->extraData ) ) {
// unset( $this->extraData['paths'][$pathType] );
// }
// }
//
// /**
// * @since 1.21
// *
// * @param String $siteType
// *
// * @return Site
// */
// public static function newForType( $siteType ) {
// global $wgSiteTypes;
//
// if ( array_key_exists( $siteType, $wgSiteTypes ) ) {
// return new $wgSiteTypes[$siteType]();
// }
//
// return new Site();
// }
//
// /**
// * @see Serializable::serialize
// *
// * @since 1.21
// *
// * @return String
// */
// public function serialize() {
// $fields = [
// 'globalid' => $this->globalId,
// 'type' => $this->type,
// 'group' => $this->group,
// 'source' => $this->source,
// 'language' => $this->languageCode,
// 'localids' => $this->localIds,
// 'config' => $this->extraConfig,
// 'data' => $this->extraData,
// 'forward' => $this->forward,
// 'internalid' => $this->internalId,
//
// ];
//
// return serialize( $fields );
// }
//
// /**
// * @see Serializable::unserialize
// *
// * @since 1.21
// *
// * @param String $serialized
// */
// public function unserialize( $serialized ) {
// $fields = unserialize( $serialized );
//
// $this->__construct( $fields['type'] );
//
// $this->setGlobalId( $fields['globalid'] );
// $this->setGroup( $fields['group'] );
// $this->setSource( $fields['source'] );
// $this->setLanguageCode( $fields['language'] );
// $this->localIds = $fields['localids'];
// $this->setExtraConfig( $fields['config'] );
// $this->setExtraData( $fields['data'] );
// $this->setForward( $fields['forward'] );
// $this->setInternalId( $fields['internalid'] );
// }
}

View File

@ -0,0 +1,345 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.mediawiki.includes.site; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*; import gplx.xowa.mediawiki.includes.*;
/**
* Collection of Site objects.
*/
public class XomwSiteList {
public int Len() {return 0;}
public XomwSite GetAt(int idx) {return null;}
// /**
// * Internal site identifiers pointing to their sites offset value.
// *
// * @since 1.21
// *
// * @var array Array of integer
// */
// protected $byInternalId = [];
//
// /**
// * Global site identifiers pointing to their sites offset value.
// *
// * @since 1.21
// *
// * @var array Array of String
// */
// protected $byGlobalId = [];
//
// /**
// * Navigational site identifiers alias inter-language prefixes
// * pointing to their sites offset value.
// *
// * @since 1.23
// *
// * @var array Array of String
// */
// protected $byNavigationId = [];
//
// /**
// * @see GenericArrayObject::getObjectType
// *
// * @since 1.21
// *
// * @return String
// */
// public function getObjectType() {
// return 'Site';
// }
//
// /**
// * @see GenericArrayObject::preSetElement
// *
// * @since 1.21
// *
// * @param int|String $index
// * @param Site $site
// *
// * @return boolean
// */
// protected function preSetElement( $index, $site ) {
// if ( $this->hasSite( $site->getGlobalId() ) ) {
// $this->removeSite( $site->getGlobalId() );
// }
//
// $this->byGlobalId[$site->getGlobalId()] = $index;
// $this->byInternalId[$site->getInternalId()] = $index;
//
// $ids = $site->getNavigationIds();
// foreach ( $ids as $navId ) {
// $this->byNavigationId[$navId] = $index;
// }
//
// return true;
// }
//
// /**
// * @see ArrayObject::offsetUnset()
// *
// * @since 1.21
// *
// * @param mixed $index
// */
// public function offsetUnset( $index ) {
// if ( $this->offsetExists( $index ) ) {
// /**
// * @var Site $site
// */
// $site = $this->offsetGet( $index );
//
// unset( $this->byGlobalId[$site->getGlobalId()] );
// unset( $this->byInternalId[$site->getInternalId()] );
//
// $ids = $site->getNavigationIds();
// foreach ( $ids as $navId ) {
// unset( $this->byNavigationId[$navId] );
// }
// }
//
// parent::offsetUnset( $index );
// }
//
// /**
// * Returns all the global site identifiers.
// * Optionally only those belonging to the specified group.
// *
// * @since 1.21
// *
// * @return array
// */
// public function getGlobalIdentifiers() {
// return array_keys( $this->byGlobalId );
// }
//
// /**
// * Returns if the list contains the site with the provided global site identifier.
// *
// * @param String $globalSiteId
// *
// * @return boolean
// */
// public function hasSite( $globalSiteId ) {
// return array_key_exists( $globalSiteId, $this->byGlobalId );
// }
//
// /**
// * Returns the Site with the provided global site identifier.
// * The site needs to exist, so if not sure, call hasGlobalId first.
// *
// * @since 1.21
// *
// * @param String $globalSiteId
// *
// * @return Site
// */
// public function getSite( $globalSiteId ) {
// return $this->offsetGet( $this->byGlobalId[$globalSiteId] );
// }
//
// /**
// * Removes the site with the specified global site identifier.
// * The site needs to exist, so if not sure, call hasGlobalId first.
// *
// * @since 1.21
// *
// * @param String $globalSiteId
// */
// public function removeSite( $globalSiteId ) {
// $this->offsetUnset( $this->byGlobalId[$globalSiteId] );
// }
//
// /**
// * Returns if the list contains no sites.
// *
// * @since 1.21
// *
// * @return boolean
// */
// public function isEmpty() {
// return $this->byGlobalId === [];
// }
//
// /**
// * Returns if the list contains the site with the provided site id.
// *
// * @param int $id
// *
// * @return boolean
// */
// public function hasInternalId( $id ) {
// return array_key_exists( $id, $this->byInternalId );
// }
//
// /**
// * Returns the Site with the provided site id.
// * The site needs to exist, so if not sure, call has first.
// *
// * @since 1.21
// *
// * @param int $id
// *
// * @return Site
// */
// public function getSiteByInternalId( $id ) {
// return $this->offsetGet( $this->byInternalId[$id] );
// }
//
// /**
// * Removes the site with the specified site id.
// * The site needs to exist, so if not sure, call has first.
// *
// * @since 1.21
// *
// * @param int $id
// */
// public function removeSiteByInternalId( $id ) {
// $this->offsetUnset( $this->byInternalId[$id] );
// }
//
// /**
// * Returns if the list contains the site with the provided navigational site id.
// *
// * @param String $id
// *
// * @return boolean
// */
// public function hasNavigationId( $id ) {
// return array_key_exists( $id, $this->byNavigationId );
// }
//
// /**
// * Returns the Site with the provided navigational site id.
// * The site needs to exist, so if not sure, call has first.
// *
// * @since 1.23
// *
// * @param String $id
// *
// * @return Site
// */
// public function getSiteByNavigationId( $id ) {
// return $this->offsetGet( $this->byNavigationId[$id] );
// }
//
// /**
// * Removes the site with the specified navigational site id.
// * The site needs to exist, so if not sure, call has first.
// *
// * @since 1.23
// *
// * @param String $id
// */
// public function removeSiteByNavigationId( $id ) {
// $this->offsetUnset( $this->byNavigationId[$id] );
// }
//
// /**
// * Sets a site in the list. If the site was not there,
// * it will be added. If it was, it will be updated.
// *
// * @since 1.21
// *
// * @param Site $site
// */
// public function setSite( Site $site ) {
// $this[] = $site;
// }
//
// /**
// * Returns the sites that are in the provided group.
// *
// * @since 1.21
// *
// * @param String $groupName
// *
// * @return SiteList
// */
// public function getGroup( $groupName ) {
// $group = new self();
//
// /**
// * @var Site $site
// */
// foreach ( $this as $site ) {
// if ( $site->getGroup() === $groupName ) {
// $group[] = $site;
// }
// }
//
// return $group;
// }
//
// /**
// * A version ID that identifies the serialization structure used by getSerializationData()
// * and unserialize(). This is useful for constructing cache keys in cases where the cache relies
// * on serialization for storing the SiteList.
// *
// * @var String A String uniquely identifying the version of the serialization structure,
// * not including any sub-structures.
// */
// static final SERIAL_VERSION_ID = '2014-03-17';
//
// /**
// * Returns the version ID that identifies the serialization structure used by
// * getSerializationData() and unserialize(), including the structure of any nested structures.
// * This is useful for constructing cache keys in cases where the cache relies
// * on serialization for storing the SiteList.
// *
// * @return String A String uniquely identifying the version of the serialization structure,
// * including any sub-structures.
// */
// public static function getSerialVersionId() {
// return self::SERIAL_VERSION_ID . '+Site:' . Site::SERIAL_VERSION_ID;
// }
//
// /**
// * @see GenericArrayObject::getSerializationData
// *
// * @since 1.21
// *
// * @return array
// */
// protected function getSerializationData() {
// // NOTE: When changing the structure, either implement unserialize() to handle the
// // old structure too, or update SERIAL_VERSION_ID to kill any caches.
// return array_merge(
// parent::getSerializationData(),
// [
// 'internalIds' => $this->byInternalId,
// 'globalIds' => $this->byGlobalId,
// 'navigationIds' => $this->byNavigationId
// ]
// );
// }
//
// /**
// * @see GenericArrayObject::unserialize
// *
// * @since 1.21
// *
// * @param String $serialization
// *
// * @return array
// */
// public function unserialize( $serialization ) {
// $serializationData = parent::unserialize( $serialization );
//
// $this->byInternalId = $serializationData['internalIds'];
// $this->byGlobalId = $serializationData['globalIds'];
// $this->byNavigationId = $serializationData['navigationIds'];
//
// return $serializationData;
// }
}

View File

@ -0,0 +1,42 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.mediawiki.includes.site; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*; import gplx.xowa.mediawiki.includes.*;
/**
* Interface for service objects providing a lookup of Site objects.
*/
public interface XomwSiteLookup {
/**
* Returns the site with provided global id, or null if there is no such site.
*
* @since 1.25
*
* @param String $globalId
*
* @return Site|null
*/
XomwSite getSite(byte[] globalId);
/**
* Returns a list of all sites.
*
* @since 1.25
*
* @return SiteList
*/
XomwSiteList getSites();
}

View File

@ -15,7 +15,9 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/ */
package gplx.xowa.mediawiki.includes.title; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*; import gplx.xowa.mediawiki.includes.*; package gplx.xowa.mediawiki.includes.title; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*; import gplx.xowa.mediawiki.includes.*;
import gplx.xowa.mediawiki.languages.*; import gplx.xowa.mediawiki.languages.*;
import gplx.xowa.mediawiki.includes.interwiki.*;
public class XomwMediaWikiTitleCodec implements XomwTitleFormatter { public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
private XomwMediaWikiServices mws;
/** /**
* @var Language * @var Language
*/ */
@ -43,7 +45,8 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
// $this->genderCache = $genderCache; // $this->genderCache = $genderCache;
// $this->localInterwikis = (array)$localInterwikis; // $this->localInterwikis = (array)$localInterwikis;
// } // }
public XomwMediaWikiTitleCodec(XomwLanguage language) { public XomwMediaWikiTitleCodec(XomwMediaWikiServices mws, XomwLanguage language) {
this.mws = mws;
this.language = language; this.language = language;
} }
@ -291,11 +294,11 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
// Disallow Talk:File:x type titles... // Disallow Talk:File:x type titles...
throw new XomwMalformedTitleException("title-invalid-talk-namespace", text); throw new XomwMalformedTitleException("title-invalid-talk-namespace", text);
} }
// else if (Interwiki::isValidInterwiki($x[1])) { else if (XomwInterwiki.isValidInterwiki(mws, m[0])) {
// // TODO: get rid of global state! // TODO: get rid of global state!
// // Disallow Talk:Interwiki:x type titles... // Disallow Talk:Interwiki:x type titles...
// throw new XomwMalformedTitleException('title-invalid-talk-namespace', text); throw new XomwMalformedTitleException("title-invalid-talk-namespace", text);
// } }
} }
} }
// else if (Interwiki::isValidInterwiki($p)) { // else if (Interwiki::isValidInterwiki($p)) {

View File

@ -45,7 +45,8 @@ class XomwMediaWikiTitleCodecFxt {
return new XomwMediaWikiTitleCodecParts(Bry_.new_u8(dbkey), ns); return new XomwMediaWikiTitleCodecParts(Bry_.new_u8(dbkey), ns);
} }
public XomwMediaWikiTitleCodec Make_codec(XomwLanguage lang) { public XomwMediaWikiTitleCodec Make_codec(XomwLanguage lang) {
return new XomwMediaWikiTitleCodec(lang); XomwEnv env = new XomwEnv(lang.XoLang());
return env.MediaWikiServices().getTitleFormatter();
} }
public XomwLanguage Make_lang() { public XomwLanguage Make_lang() {
Xoae_app app = Xoa_app_fxt.Make__app__edit(); Xoae_app app = Xoa_app_fxt.Make__app__edit();

View File

@ -17,6 +17,8 @@ package gplx.xowa.mediawiki.languages; import gplx.*; import gplx.xowa.*; import
import gplx.xowa.mediawiki.includes.*; import gplx.xowa.mediawiki.includes.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.*;
public class XomwLanguage { public class XomwLanguage {
public Xol_lang_itm XoLang() {return xoLang;} private Xol_lang_itm xoLang = null;
private final Bry_bfr tmpBfr = Bry_bfr_.New();
// /** // /**
// * @var LanguageConverter // * @var LanguageConverter
// */ // */
@ -193,8 +195,6 @@ public class XomwLanguage {
// -\x{1edff}\x{1ef00}-\x{1efff}\x{608}\x{60b}\x{60d}\x{61b}-\x{64a}\x{66d}-\x{66f}\x{671}-\x{6d5}\x{6e5}\x{6e6}\x{6ee}\x{6ef}\x{6fa}-\x{710}\x{712}-\x{72f}\x{74b}-\x{7a5}\x{7b1}-\x{7bf}\x{8a0}-\x{8e2}\x{fb50}-\x{fd3d}\x{fd40}-\x{fdcf}\x{fdf0}-\x{fdfc}\x{fdfe}\x{fdff}\x{fe70}-\x{fefe}\x{1ee00}-\x{1eeef}\x{1eef2}-\x{1eeff}]))/u'; // -\x{1edff}\x{1ef00}-\x{1efff}\x{608}\x{60b}\x{60d}\x{61b}-\x{64a}\x{66d}-\x{66f}\x{671}-\x{6d5}\x{6e5}\x{6e6}\x{6ee}\x{6ef}\x{6fa}-\x{710}\x{712}-\x{72f}\x{74b}-\x{7a5}\x{7b1}-\x{7bf}\x{8a0}-\x{8e2}\x{fb50}-\x{fd3d}\x{fd40}-\x{fdcf}\x{fdf0}-\x{fdfc}\x{fdfe}\x{fdff}\x{fe70}-\x{fefe}\x{1ee00}-\x{1eeef}\x{1eef2}-\x{1eeff}]))/u';
// // @codeCoverageIgnoreEnd // // @codeCoverageIgnoreEnd
// // @codingStandardsIgnoreEnd // // @codingStandardsIgnoreEnd
private Xol_lang_itm xoLang = null;
private final Bry_bfr tmpBfr = Bry_bfr_.New();
// /** // /**
// * Get a cached or new language Object for a given language code // * Get a cached or new language Object for a given language code