mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
Xomw: Implement Interwiki part of GetTitleCodec
This commit is contained in:
@@ -19,19 +19,18 @@ public class XomwInterwikiLookupAdapter implements XomwInterwikiLookup {
|
||||
/**
|
||||
* @var SiteLookup
|
||||
*/
|
||||
// private final XomwSiteLookup siteLookup;
|
||||
private final XomwSiteLookup siteLookup;
|
||||
|
||||
// /**
|
||||
// * @var Interwiki[]|null associative array mapping interwiki prefixes to Interwiki objects
|
||||
// */
|
||||
// private $interwikiMap;
|
||||
/**
|
||||
* @var Interwiki[]|null associative array mapping interwiki prefixes to Interwiki objects
|
||||
*/
|
||||
private Ordered_hash interwikiMap = Ordered_hash_.New_bry();
|
||||
|
||||
public XomwInterwikiLookupAdapter(
|
||||
XomwSiteLookup siteLookup //,
|
||||
// array $interwikiMap = null
|
||||
public XomwInterwikiLookupAdapter (
|
||||
XomwSiteLookup siteLookup
|
||||
// Ordered_hash interwikiMap
|
||||
) {
|
||||
// this.siteLookup = siteLookup;
|
||||
// this.interwikiMap = $interwikiMap;
|
||||
this.siteLookup = siteLookup;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -42,120 +41,129 @@ public class XomwInterwikiLookupAdapter implements XomwInterwikiLookup {
|
||||
* @return boolean Whether it exists
|
||||
*/
|
||||
public boolean isValidInterwiki(byte[] prefix) {
|
||||
return false;
|
||||
// return array_key_exists($prefix, this.getInterwikiMap());
|
||||
return XophpArray.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|boolean
|
||||
// */
|
||||
// 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 String[] List of prefixes
|
||||
// */
|
||||
// public function getAllPrefixes($local = null) {
|
||||
// if ($local === null) {
|
||||
// return array_keys(this.getInterwikiMap());
|
||||
// }
|
||||
// $res = [];
|
||||
// foreach (this.getInterwikiMap() as $interwikiId => $interwiki) {
|
||||
// if ($interwiki->isLocal() === $local) {
|
||||
// $res[] = $interwikiId;
|
||||
// }
|
||||
// }
|
||||
// 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] ]);
|
||||
// }
|
||||
/**
|
||||
* See InterwikiLookup::fetch
|
||||
* It loads the whole interwiki map.
|
||||
*
|
||||
* @param String $prefix Interwiki prefix to use
|
||||
* @return Interwiki|null|boolean
|
||||
*/
|
||||
public XomwInterwiki fetch(byte[] prefix) {
|
||||
if (prefix == Bry_.Empty) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!this.isValidInterwiki(prefix)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (XomwInterwiki)this.interwikiMap.Get_by(prefix);
|
||||
}
|
||||
|
||||
/**
|
||||
* See InterwikiLookup::getAllPrefixes
|
||||
*
|
||||
* @param String|null $local If set, limits output to local/non-local interwikis
|
||||
* @return String[] List of prefixes
|
||||
*/
|
||||
public byte[][] getAllPrefixes(boolean local) {
|
||||
if (!local) {
|
||||
XophpArray.array_keys_bry(this.getInterwikiMap());
|
||||
}
|
||||
List_adp res = List_adp_.New();
|
||||
Ordered_hash hash = this.getInterwikiMap();
|
||||
int len = hash.Len();
|
||||
for (int i = 0; i < len; i++) {
|
||||
XomwInterwiki interwiki = (XomwInterwiki)hash.Get_at(i);
|
||||
if (interwiki.isLocal() == local) {
|
||||
res.Add(interwiki.interwikiId);
|
||||
}
|
||||
}
|
||||
return (byte[][])res.To_ary_and_clear(byte[].class);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * 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 Object loadInterwikiMap() {
|
||||
//// $interwikiMap = [];
|
||||
// XomwSiteList siteList = this.siteLookup.getSites();
|
||||
// int len = siteList.Len();
|
||||
// for (int i = 0; i < len; i++) {
|
||||
// XomwSite site = siteList.GetAt(i);
|
||||
//// $interwikis = this.getSiteInterwikis($site);
|
||||
//// $interwikiMap = array_merge($interwikiMap, $interwikis);
|
||||
// }
|
||||
//// this.interwikiMap = $interwikiMap;
|
||||
// return null;
|
||||
// }
|
||||
private Ordered_hash loadInterwikiMap() {
|
||||
Ordered_hash interwikiMap = Ordered_hash_.New();
|
||||
XomwSiteList siteList = this.siteLookup.getSites();
|
||||
int len = siteList.Len();
|
||||
for (int i = 0; i < len; i++) {
|
||||
XomwSite site = siteList.GetAt(i);
|
||||
XomwInterwiki[] interwikis = this.getSiteInterwikis(site);
|
||||
// interwikiMap = array_merge(interwikiMap, interwikis);
|
||||
for (XomwInterwiki interwiki : interwikis) {
|
||||
interwikiMap.Add(interwiki.interwikiId, interwiki);
|
||||
}
|
||||
}
|
||||
this.interwikiMap = interwikiMap;
|
||||
return interwikiMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get interwikiMap attribute, load if needed.
|
||||
*
|
||||
* @return Interwiki[]
|
||||
*/
|
||||
// private Object getInterwikiMap() {
|
||||
// if (this.interwikiMap === null) {
|
||||
// this.loadInterwikiMap();
|
||||
// }
|
||||
// return this.interwikiMap;
|
||||
// return null;
|
||||
// }
|
||||
private Ordered_hash 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;
|
||||
// }
|
||||
/**
|
||||
* Load interwikis for the given site
|
||||
*
|
||||
* @param Site site
|
||||
* @return Interwiki[]
|
||||
*/
|
||||
private XomwInterwiki[] getSiteInterwikis(XomwSite site) {
|
||||
Ordered_hash interwikis = Ordered_hash_.New();
|
||||
Ordered_hash hash = site.getInterwikiIds();
|
||||
int len = hash.Len();
|
||||
for (int i = 0; i < len; i++) {
|
||||
String interwiki = (String)hash.Get_at(i);
|
||||
String url = site.getPageUrl();
|
||||
String path = null;
|
||||
if (Type_adp_.Eq_typeSafe(site, XomwMediaWikiSite.class)) {
|
||||
path = ((XomwMediaWikiSite)site).getFileUrl("api.php");
|
||||
} else {
|
||||
path = "";
|
||||
}
|
||||
boolean local = String_.Eq(site.getSource(), "local");
|
||||
// TODO: How to adapt trans?
|
||||
interwikis.Add(interwiki, new XomwInterwiki(
|
||||
Bry_.new_u8(interwiki),
|
||||
Bry_.new_u8(url),
|
||||
Bry_.new_u8(path),
|
||||
Bry_.new_u8(site.getGlobalId()),
|
||||
local
|
||||
, false
|
||||
));
|
||||
}
|
||||
return (XomwInterwiki[])interwikis.To_ary_and_clear(XomwInterwiki.class);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user