mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
Xomw: Implement Interwiki part of GetTitleCodec
This commit is contained in:
parent
0b762933b2
commit
dcdc69e374
@ -32,7 +32,8 @@ public class XomwEnv {
|
|||||||
XomwLanguage language = new XomwLanguage(xoLang);
|
XomwLanguage language = new XomwLanguage(xoLang);
|
||||||
XomwSiteLookup siteLookup = new XomwXowaSiteLookup();
|
XomwSiteLookup siteLookup = new XomwXowaSiteLookup();
|
||||||
XomwInterwikiLookup interwikiLookup = new XomwInterwikiLookupAdapter(siteLookup);
|
XomwInterwikiLookup interwikiLookup = new XomwInterwikiLookupAdapter(siteLookup);
|
||||||
this.mediaWikiServices = new XomwMediaWikiServices(interwikiLookup, language);
|
byte[][] localInterwikis = new byte[0][]; // TODO.XO: pass in to XomwEnv or retrieve from datastore
|
||||||
|
this.mediaWikiServices = new XomwMediaWikiServices(this, interwikiLookup, language, localInterwikis);
|
||||||
}
|
}
|
||||||
|
|
||||||
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();
|
||||||
|
@ -25,12 +25,17 @@ public class XophpArray {
|
|||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
public static boolean array_key_exists(int key, Ordered_hash array) {
|
public static byte[][] array_keys_bry(Ordered_hash array) {
|
||||||
return array.Has(key);
|
int len = array.Len();
|
||||||
|
byte[][] rv = new byte[len][];
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
rv[i] = (byte[])array.Get_at(i);
|
||||||
}
|
}
|
||||||
public static boolean array_key_exists(String key, Ordered_hash array) {
|
return rv;
|
||||||
return array.Has(key);
|
|
||||||
}
|
}
|
||||||
|
public static boolean array_key_exists(int key, Ordered_hash array) {return array.Has(key);}
|
||||||
|
public static boolean array_key_exists(String key, Ordered_hash array) {return array.Has(key);}
|
||||||
|
public static boolean array_key_exists(byte[] key, Ordered_hash array) {return array.Has(key);}
|
||||||
public static boolean array_is_empty(Ordered_hash array) {
|
public static boolean array_is_empty(Ordered_hash array) {
|
||||||
return array.Len() == 0;
|
return array.Len() == 0;
|
||||||
}
|
}
|
||||||
|
@ -35,9 +35,11 @@ public class XomwMediaWikiServices {
|
|||||||
private final XomwMediaWikiTitleCodec titleParser;
|
private final XomwMediaWikiTitleCodec titleParser;
|
||||||
private final XomwInterwikiLookup interwikiLookup;
|
private final XomwInterwikiLookup interwikiLookup;
|
||||||
|
|
||||||
public XomwMediaWikiServices(XomwInterwikiLookup interwikiLookup, XomwLanguage language) {
|
public XomwEnv env;
|
||||||
|
public XomwMediaWikiServices(XomwEnv env, XomwInterwikiLookup interwikiLookup, XomwLanguage language, byte[][] localInterwikis) {
|
||||||
|
this.env = env;
|
||||||
this.interwikiLookup = interwikiLookup;
|
this.interwikiLookup = interwikiLookup;
|
||||||
this.titleParser = new XomwMediaWikiTitleCodec(this, language);
|
this.titleParser = new XomwMediaWikiTitleCodec(this, language, localInterwikis);
|
||||||
}
|
}
|
||||||
|
|
||||||
// /**
|
// /**
|
||||||
|
@ -737,17 +737,17 @@ public class XomwMessage {
|
|||||||
// $this->interface = false;
|
// $this->interface = false;
|
||||||
// return $this;
|
// return $this;
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
// /**
|
/**
|
||||||
// * Request the message in the wiki's content language,
|
* Request the message in the wiki's content language,
|
||||||
// * unless it is disabled for this message.
|
* unless it is disabled for this message.
|
||||||
// *
|
*
|
||||||
// * @since 1.17
|
* @since 1.17
|
||||||
// * @see $wgForceUIMsgAsContentMsg
|
* @see $wgForceUIMsgAsContentMsg
|
||||||
// *
|
*
|
||||||
// * @return Message $this
|
* @return Message $this
|
||||||
// */
|
*/
|
||||||
// public function inContentLanguage() {
|
public XomwMessage inContentLanguage() {
|
||||||
// global $wgForceUIMsgAsContentMsg;
|
// global $wgForceUIMsgAsContentMsg;
|
||||||
// if ( in_array( $this->key, (array)$wgForceUIMsgAsContentMsg ) ) {
|
// if ( in_array( $this->key, (array)$wgForceUIMsgAsContentMsg ) ) {
|
||||||
// return $this;
|
// return $this;
|
||||||
@ -756,8 +756,9 @@ public class XomwMessage {
|
|||||||
// global $wgContLang;
|
// global $wgContLang;
|
||||||
// $this->inLanguage( $wgContLang );
|
// $this->inLanguage( $wgContLang );
|
||||||
// return $this;
|
// return $this;
|
||||||
// }
|
return this;
|
||||||
//
|
}
|
||||||
|
|
||||||
// /**
|
// /**
|
||||||
// * Allows manipulating the interface message flag directly.
|
// * Allows manipulating the interface message flag directly.
|
||||||
// * Can be used to restore the flag after setting a language.
|
// * Can be used to restore the flag after setting a language.
|
||||||
|
@ -546,21 +546,21 @@ public class XomwTitle {
|
|||||||
// return null;
|
// return null;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
// /**
|
/**
|
||||||
// * Create a new Title for the Main Page
|
* Create a new Title for the Main Page
|
||||||
// *
|
*
|
||||||
// * @return Title The new Object
|
* @return Title The new Object
|
||||||
// */
|
*/
|
||||||
// public static function newMainPage() {
|
public static XomwTitle newMainPage(XomwEnv env) {
|
||||||
// $title = Title::newFromText(wfMessage('mainpage').inContentLanguage().text());
|
XomwTitle title = XomwTitle.newFromText(env, XomwGlobalFunctions.wfMessage(env, "mainpage").inContentLanguage().text());
|
||||||
// // Don't give fatal errors if the message is broken
|
// Don't give fatal errors if the message is broken
|
||||||
// if (!$title) {
|
if (title == null) {
|
||||||
// $title = Title::newFromText('Main Page');
|
title = XomwTitle.newFromText(env, Bry_.new_a7("Main Page"));
|
||||||
// }
|
}
|
||||||
// return $title;
|
return title;
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// /**
|
// /**
|
||||||
// * Get the prefixed DB key associated with an ID
|
// * Get the prefixed DB key associated with an ID
|
||||||
// *
|
// *
|
||||||
@ -898,19 +898,19 @@ public class XomwTitle {
|
|||||||
return this.mDbkeyform;
|
return this.mDbkeyform;
|
||||||
}
|
}
|
||||||
|
|
||||||
// /**
|
/**
|
||||||
// * Get the DB key with the initial letter case as specified by the user
|
* Get the DB key with the initial letter case as specified by the user
|
||||||
// *
|
*
|
||||||
// * @return String DB key
|
* @return String DB key
|
||||||
// */
|
*/
|
||||||
// function getUserCaseDBKey() {
|
public byte[] getUserCaseDBKey() {
|
||||||
// if (!is_null(this.mUserCaseDBKey)) {
|
if (this.mUserCaseDBKey != null) {
|
||||||
// return this.mUserCaseDBKey;
|
return this.mUserCaseDBKey;
|
||||||
// } else {
|
} else {
|
||||||
// // If created via makeTitle(), this.mUserCaseDBKey is not set.
|
// If created via makeTitle(), this.mUserCaseDBKey is not set.
|
||||||
// return this.mDbkeyform;
|
return this.mDbkeyform;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the namespace index, i.e. one of the NS_xxxx constants.
|
* Get the namespace index, i.e. one of the NS_xxxx constants.
|
||||||
|
@ -39,6 +39,8 @@ public class XomwInterwiki {
|
|||||||
/** @var boolean Whether interwiki transclusions are allowed */
|
/** @var boolean Whether interwiki transclusions are allowed */
|
||||||
private boolean mTrans;
|
private boolean mTrans;
|
||||||
|
|
||||||
|
public byte[] interwikiId;
|
||||||
|
|
||||||
public XomwInterwiki(byte[] prefix, byte[] url, byte[] api, byte[] wikiId, boolean local, boolean trans) {
|
public XomwInterwiki(byte[] prefix, byte[] url, byte[] api, byte[] wikiId, boolean local, boolean trans) {
|
||||||
this.mPrefix = prefix;
|
this.mPrefix = prefix;
|
||||||
this.mURL = url;
|
this.mURL = url;
|
||||||
|
@ -28,22 +28,22 @@ 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(boolean 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
|
||||||
|
@ -19,19 +19,18 @@ public class XomwInterwikiLookupAdapter implements XomwInterwikiLookup {
|
|||||||
/**
|
/**
|
||||||
* @var SiteLookup
|
* @var SiteLookup
|
||||||
*/
|
*/
|
||||||
// private final XomwSiteLookup 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 Ordered_hash interwikiMap = Ordered_hash_.New_bry();
|
||||||
|
|
||||||
public XomwInterwikiLookupAdapter (
|
public XomwInterwikiLookupAdapter (
|
||||||
XomwSiteLookup siteLookup //,
|
XomwSiteLookup siteLookup
|
||||||
// array $interwikiMap = null
|
// Ordered_hash interwikiMap
|
||||||
) {
|
) {
|
||||||
// this.siteLookup = siteLookup;
|
this.siteLookup = siteLookup;
|
||||||
// this.interwikiMap = $interwikiMap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -42,48 +41,50 @@ public class XomwInterwikiLookupAdapter implements XomwInterwikiLookup {
|
|||||||
* @return boolean Whether it exists
|
* @return boolean Whether it exists
|
||||||
*/
|
*/
|
||||||
public boolean isValidInterwiki(byte[] prefix) {
|
public boolean isValidInterwiki(byte[] prefix) {
|
||||||
return false;
|
return XophpArray.array_key_exists(prefix, this.getInterwikiMap());
|
||||||
// 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|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::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
|
// * See InterwikiLookup::invalidateCache
|
||||||
// *
|
// *
|
||||||
@ -93,69 +94,76 @@ public class XomwInterwikiLookupAdapter implements XomwInterwikiLookup {
|
|||||||
// 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 Object loadInterwikiMap() {
|
private Ordered_hash loadInterwikiMap() {
|
||||||
//// $interwikiMap = [];
|
Ordered_hash interwikiMap = Ordered_hash_.New();
|
||||||
// XomwSiteList siteList = this.siteLookup.getSites();
|
XomwSiteList siteList = this.siteLookup.getSites();
|
||||||
// int len = siteList.Len();
|
int len = siteList.Len();
|
||||||
// for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
// XomwSite site = siteList.GetAt(i);
|
XomwSite site = siteList.GetAt(i);
|
||||||
//// $interwikis = this.getSiteInterwikis($site);
|
XomwInterwiki[] interwikis = this.getSiteInterwikis(site);
|
||||||
//// $interwikiMap = array_merge($interwikiMap, $interwikis);
|
// interwikiMap = array_merge(interwikiMap, interwikis);
|
||||||
// }
|
for (XomwInterwiki interwiki : interwikis) {
|
||||||
//// this.interwikiMap = $interwikiMap;
|
interwikiMap.Add(interwiki.interwikiId, interwiki);
|
||||||
// return null;
|
}
|
||||||
// }
|
}
|
||||||
|
this.interwikiMap = interwikiMap;
|
||||||
|
return interwikiMap;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get interwikiMap attribute, load if needed.
|
* Get interwikiMap attribute, load if needed.
|
||||||
*
|
*
|
||||||
* @return Interwiki[]
|
* @return Interwiki[]
|
||||||
*/
|
*/
|
||||||
// private Object getInterwikiMap() {
|
private Ordered_hash 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 XomwInterwiki[] getSiteInterwikis(XomwSite site) {
|
||||||
// private function getSiteInterwikis(Site $site) {
|
Ordered_hash interwikis = Ordered_hash_.New();
|
||||||
// $interwikis = [];
|
Ordered_hash hash = site.getInterwikiIds();
|
||||||
// foreach ($site->getInterwikiIds() as $interwiki) {
|
int len = hash.Len();
|
||||||
// $url = $site->getPageUrl();
|
for (int i = 0; i < len; i++) {
|
||||||
// if ($site instanceof MediaWikiSite) {
|
String interwiki = (String)hash.Get_at(i);
|
||||||
// $path = $site->getFileUrl('api.php');
|
String url = site.getPageUrl();
|
||||||
// } else {
|
String path = null;
|
||||||
// $path = '';
|
if (Type_adp_.Eq_typeSafe(site, XomwMediaWikiSite.class)) {
|
||||||
// }
|
path = ((XomwMediaWikiSite)site).getFileUrl("api.php");
|
||||||
// $local = $site->getSource() === 'local';
|
} else {
|
||||||
// // TODO: How to adapt trans?
|
path = "";
|
||||||
// $interwikis[$interwiki] = new Interwiki(
|
}
|
||||||
// $interwiki,
|
boolean local = String_.Eq(site.getSource(), "local");
|
||||||
// $url,
|
// TODO: How to adapt trans?
|
||||||
// $path,
|
interwikis.Add(interwiki, new XomwInterwiki(
|
||||||
// $site->getGlobalId(),
|
Bry_.new_u8(interwiki),
|
||||||
// $local
|
Bry_.new_u8(url),
|
||||||
// );
|
Bry_.new_u8(path),
|
||||||
// }
|
Bry_.new_u8(site.getGlobalId()),
|
||||||
// return $interwikis;
|
local
|
||||||
// }
|
, false
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return (XomwInterwiki[])interwikis.To_ary_and_clear(XomwInterwiki.class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ package gplx.xowa.mediawiki.includes.site; import gplx.*; import gplx.xowa.*; im
|
|||||||
*
|
*
|
||||||
* @ingroup Site
|
* @ingroup Site
|
||||||
*/
|
*/
|
||||||
class XomwMediaWikiSite extends XomwSite { private static final String PATH_FILE = "file_path";
|
public class XomwMediaWikiSite extends XomwSite { private static final String PATH_FILE = "file_path";
|
||||||
private static final String PATH_PAGE = "page_path";
|
private static final String PATH_PAGE = "page_path";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -187,6 +187,7 @@ class XomwMediaWikiSite extends XomwSite { private static final String PATH_FILE
|
|||||||
*
|
*
|
||||||
* @return String
|
* @return String
|
||||||
*/
|
*/
|
||||||
|
public String getFileUrl() {return getFileUrl(null);}
|
||||||
public String getFileUrl(String path) {
|
public String getFileUrl(String path) {
|
||||||
String filePath = this.getPath(XomwMediaWikiSite.PATH_FILE);
|
String filePath = this.getPath(XomwMediaWikiSite.PATH_FILE);
|
||||||
|
|
||||||
|
@ -362,6 +362,7 @@ public class XomwSite {
|
|||||||
*
|
*
|
||||||
* @return String|boolean
|
* @return String|boolean
|
||||||
*/
|
*/
|
||||||
|
@gplx.Virtual public String getPageUrl() {return getPageUrl(null);}
|
||||||
@gplx.Virtual public String getPageUrl(String pageName) {
|
@gplx.Virtual public String getPageUrl(String pageName) {
|
||||||
String url = this.getLinkPath();
|
String url = this.getLinkPath();
|
||||||
|
|
||||||
|
@ -27,27 +27,28 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
|
|||||||
// * @var GenderCache
|
// * @var GenderCache
|
||||||
// */
|
// */
|
||||||
// protected $genderCache;
|
// protected $genderCache;
|
||||||
//
|
|
||||||
// /**
|
/**
|
||||||
// * @var String[]
|
* @var String[]
|
||||||
// */
|
*/
|
||||||
// protected $localInterwikis;
|
private byte[][] localInterwikis;
|
||||||
//
|
|
||||||
// /**
|
// /**
|
||||||
// * @param Language language The language Object to use for localizing namespace names.
|
// * @param Language language The language Object to use for localizing namespace names.
|
||||||
// * @param GenderCache $genderCache The gender cache for generating gendered namespace names
|
// * @param GenderCache $genderCache The gender cache for generating gendered namespace names
|
||||||
// * @param String[]|String $localInterwikis
|
// * @param String[]|String localInterwikis
|
||||||
// */
|
// */
|
||||||
// public function __construct(Language language, GenderCache $genderCache,
|
// public function __construct(Language language, GenderCache $genderCache,
|
||||||
// $localInterwikis = []
|
// localInterwikis = []
|
||||||
// ) {
|
// ) {
|
||||||
// $this->language = language;
|
// $this.language = language;
|
||||||
// $this->genderCache = $genderCache;
|
// $this.genderCache = $genderCache;
|
||||||
// $this->localInterwikis = (array)$localInterwikis;
|
// $this.localInterwikis = (array)localInterwikis;
|
||||||
// }
|
// }
|
||||||
public XomwMediaWikiTitleCodec(XomwMediaWikiServices mws, XomwLanguage language) {
|
public XomwMediaWikiTitleCodec(XomwMediaWikiServices mws, XomwLanguage language, byte[][] localInterwikis) {
|
||||||
this.mws = mws;
|
this.mws = mws;
|
||||||
this.language = language;
|
this.language = language;
|
||||||
|
this.localInterwikis = localInterwikis;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -61,13 +62,13 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
|
|||||||
*/
|
*/
|
||||||
public byte[] getNamespaceName(int ns, byte[] text) {
|
public byte[] getNamespaceName(int ns, byte[] text) {
|
||||||
byte[] name = null;
|
byte[] name = null;
|
||||||
// if ($this->language->needsGenderDistinction() &&
|
// if ($this.language.needsGenderDistinction() &&
|
||||||
// XomwNamespace::hasGenderDistinction($namespace)
|
// XomwNamespace::hasGenderDistinction($namespace)
|
||||||
// ) {
|
// ) {
|
||||||
//
|
//
|
||||||
// // NOTE: we are assuming here that the title text is a user name!
|
// // NOTE: we are assuming here that the title text is a user name!
|
||||||
// $gender = $this->genderCache->getGenderOf($text, __METHOD__);
|
// $gender = $this.genderCache.getGenderOf($text, __METHOD__);
|
||||||
// $name = $this->language->getGenderNsText($namespace, $gender);
|
// $name = $this.language.getGenderNsText($namespace, $gender);
|
||||||
// } else {
|
// } else {
|
||||||
name = language.getNsText(ns);
|
name = language.getNsText(ns);
|
||||||
// }
|
// }
|
||||||
@ -93,7 +94,7 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
|
|||||||
// */
|
// */
|
||||||
// public function formatTitle($namespace, $text, $fragment = '', $interwiki = '') {
|
// public function formatTitle($namespace, $text, $fragment = '', $interwiki = '') {
|
||||||
// if ($namespace !== false) {
|
// if ($namespace !== false) {
|
||||||
// $namespace = $this->getNamespaceName($namespace, $text);
|
// $namespace = $this.getNamespaceName($namespace, $text);
|
||||||
//
|
//
|
||||||
// if ($namespace !== '') {
|
// if ($namespace !== '') {
|
||||||
// $text = $namespace . ':' . $text;
|
// $text = $namespace . ':' . $text;
|
||||||
@ -127,7 +128,7 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
|
|||||||
// // NOTE: this is an ugly cludge that allows this class to share the
|
// // NOTE: this is an ugly cludge that allows this class to share the
|
||||||
// // code for parsing with the old Title class. The parser code should
|
// // code for parsing with the old Title class. The parser code should
|
||||||
// // be refactored to avoid this.
|
// // be refactored to avoid this.
|
||||||
// $parts = $this->splitTitleString($text, $defaultNamespace);
|
// $parts = $this.splitTitleString($text, $defaultNamespace);
|
||||||
//
|
//
|
||||||
// // Relative fragment links are not supported by TitleValue
|
// // Relative fragment links are not supported by TitleValue
|
||||||
// if ($parts['dbkey'] === '') {
|
// if ($parts['dbkey'] === '') {
|
||||||
@ -147,10 +148,10 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
|
|||||||
// *
|
// *
|
||||||
// * @param LinkTarget $title
|
// * @param LinkTarget $title
|
||||||
// *
|
// *
|
||||||
// * @return String $title->getText()
|
// * @return String $title.getText()
|
||||||
// */
|
// */
|
||||||
// public function getText(LinkTarget $title) {
|
// public function getText(LinkTarget $title) {
|
||||||
// return $this->formatTitle(false, $title->getText(), '');
|
// return $this.formatTitle(false, $title.getText(), '');
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// /**
|
// /**
|
||||||
@ -161,11 +162,11 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
|
|||||||
// * @return String
|
// * @return String
|
||||||
// */
|
// */
|
||||||
// public function getPrefixedText(LinkTarget $title) {
|
// public function getPrefixedText(LinkTarget $title) {
|
||||||
// return $this->formatTitle(
|
// return $this.formatTitle(
|
||||||
// $title->getNamespace(),
|
// $title.getNamespace(),
|
||||||
// $title->getText(),
|
// $title.getText(),
|
||||||
// '',
|
// '',
|
||||||
// $title->getInterwiki()
|
// $title.getInterwiki()
|
||||||
// );
|
// );
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
@ -177,25 +178,25 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
|
|||||||
// */
|
// */
|
||||||
// public function getPrefixedDBkey(LinkTarget $target) {
|
// public function getPrefixedDBkey(LinkTarget $target) {
|
||||||
// $key = '';
|
// $key = '';
|
||||||
// if ($target->isExternal()) {
|
// if ($target.isExternal()) {
|
||||||
// $key .= $target->getInterwiki() . ':';
|
// $key .= $target.getInterwiki() . ':';
|
||||||
// }
|
// }
|
||||||
// // Try to get a namespace name, but fallback
|
// // Try to get a namespace name, but fallback
|
||||||
// // to empty String if it doesn't exist
|
// // to empty String if it doesn't exist
|
||||||
// try {
|
// try {
|
||||||
// $nsName = $this->getNamespaceName(
|
// $nsName = $this.getNamespaceName(
|
||||||
// $target->getNamespace(),
|
// $target.getNamespace(),
|
||||||
// $target->getText()
|
// $target.getText()
|
||||||
// );
|
// );
|
||||||
// } catch (InvalidArgumentException $e) {
|
// } catch (InvalidArgumentException $e) {
|
||||||
// $nsName = '';
|
// $nsName = '';
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// if ($target->getNamespace() !== 0) {
|
// if ($target.getNamespace() !== 0) {
|
||||||
// $key .= $nsName . ':';
|
// $key .= $nsName . ':';
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// $key .= $target->getText();
|
// $key .= $target.getText();
|
||||||
//
|
//
|
||||||
// return strtr($key, ' ', '_');
|
// return strtr($key, ' ', '_');
|
||||||
// }
|
// }
|
||||||
@ -208,11 +209,11 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
|
|||||||
// * @return String
|
// * @return String
|
||||||
// */
|
// */
|
||||||
// public function getFullText(LinkTarget $title) {
|
// public function getFullText(LinkTarget $title) {
|
||||||
// return $this->formatTitle(
|
// return $this.formatTitle(
|
||||||
// $title->getNamespace(),
|
// $title.getNamespace(),
|
||||||
// $title->getText(),
|
// $title.getText(),
|
||||||
// $title->getFragment(),
|
// $title.getFragment(),
|
||||||
// $title->getInterwiki()
|
// $title.getInterwiki()
|
||||||
// );
|
// );
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@ -301,43 +302,46 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// else if (Interwiki::isValidInterwiki($p)) {
|
else if (XomwInterwiki.isValidInterwiki(mws, p)) {
|
||||||
// // Interwiki link
|
// Interwiki link
|
||||||
// dbkey = $m[2];
|
dbkey = m[2];
|
||||||
// parts['interwiki'] = this.language->lc($p);
|
parts.interwiki = this.language.lc(p);
|
||||||
//
|
|
||||||
// // Redundant interwiki prefix to the local wiki
|
// Redundant interwiki prefix to the local wiki
|
||||||
// foreach (this.localInterwikis as $localIW) {
|
boolean doAnotherNamespaceSplit = false;
|
||||||
// if (0 == strcasecmp(parts['interwiki'], $localIW)) {
|
for (byte[] localIW : this.localInterwikis) {
|
||||||
// if (dbkey == '') {
|
if (Bry_.Eq(parts.interwiki, localIW)) {
|
||||||
// // Empty self-links should point to the Main Page, to ensure
|
if (Bry_.Len_eq_0(dbkey)) {
|
||||||
// // compatibility with cross-wiki transclusions and the like.
|
// Empty self-links should point to the Main Page, to ensure
|
||||||
// $mainPage = Title::newMainPage();
|
// compatibility with cross-wiki transclusions and the like.
|
||||||
// return [
|
XomwTitle mainPage = XomwTitle.newMainPage(mws.env);
|
||||||
// 'interwiki' => $mainPage->getInterwiki(),
|
XomwMediaWikiTitleCodecParts rv = new XomwMediaWikiTitleCodecParts(mainPage.getDBkey(), mainPage.getNamespace());
|
||||||
// 'local_interwiki' => true,
|
rv.interwiki = mainPage.getInterwiki();
|
||||||
// 'fragment' => $mainPage->getFragment(),
|
rv.local_interwiki = true;
|
||||||
// 'namespace' => $mainPage->getNamespace(),
|
rv.fragment = mainPage.getFragment();
|
||||||
// 'dbkey' => $mainPage->getDBkey(),
|
// rv.ns = mainPage.getNamespace();
|
||||||
// 'user_case_dbkey' => $mainPage->getUserCaseDBKey()
|
// rv.dbkey = mainPage.getDBkey();
|
||||||
// ];
|
rv.user_case_dbkey = mainPage.getUserCaseDBKey();
|
||||||
// }
|
}
|
||||||
// parts['interwiki'] = '';
|
parts.interwiki = Bry_.Empty;
|
||||||
// // local interwikis should behave like initial-colon links
|
// local interwikis should behave like initial-colon links
|
||||||
// parts['local_interwiki'] = true;
|
parts.local_interwiki = true;
|
||||||
//
|
|
||||||
// // Do another namespace split...
|
// Do another namespace split...
|
||||||
// continue 2;
|
doAnotherNamespaceSplit = true;
|
||||||
// }
|
break;
|
||||||
// }
|
}
|
||||||
//
|
}
|
||||||
// // If there's an initial colon after the interwiki, that also
|
if (doAnotherNamespaceSplit)
|
||||||
// // resets the default namespace
|
continue;
|
||||||
// if (dbkey !== '' && dbkey[0] == ':') {
|
|
||||||
// parts['namespace'] = NS_MAIN;
|
// If there's an initial colon after the interwiki, that also
|
||||||
// dbkey = substr(dbkey, 1);
|
// resets the default namespace
|
||||||
// }
|
if (dbkey != Bry_.Empty && dbkey[0] == Byte_ascii.Colon) {
|
||||||
// }
|
parts.ns = XomwDefines.NS_MAIN;
|
||||||
|
dbkey = XophpString.substr(dbkey, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
// If there's no recognized interwiki or namespace,
|
// If there's no recognized interwiki or namespace,
|
||||||
// then let the colon expression be part of the title.
|
// then let the colon expression be part of the title.
|
||||||
}
|
}
|
||||||
|
@ -2729,8 +2729,8 @@ public class XomwLanguage {
|
|||||||
* @param boolean $first
|
* @param boolean $first
|
||||||
* @return mixed|String
|
* @return mixed|String
|
||||||
*/
|
*/
|
||||||
private byte[] lc(byte[] str) {return lc(str, false);}
|
public byte[] lc(byte[] str) {return lc(str, false);}
|
||||||
private byte[] lc(byte[] str, boolean first) {
|
public byte[] lc(byte[] str, boolean first) {
|
||||||
return first
|
return first
|
||||||
? xoLang.Case_mgr().Case_build_1st_lower(tmpBfr, str, 0, str.length)
|
? xoLang.Case_mgr().Case_build_1st_lower(tmpBfr, str, 0, str.length)
|
||||||
: xoLang.Case_mgr().Case_build_lower (str, 0, str.length);
|
: xoLang.Case_mgr().Case_build_lower (str, 0, str.length);
|
||||||
|
Loading…
Reference in New Issue
Block a user