1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-09-29 23:10:52 +00:00

Xomw: Implement Interwiki part of GetTitleCodec

This commit is contained in:
gnosygnu 2017-03-25 08:54:59 -04:00
parent 0b762933b2
commit dcdc69e374
12 changed files with 278 additions and 253 deletions

View File

@ -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();

View File

@ -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][];
public static boolean array_key_exists(String key, Ordered_hash array) { for (int i = 0; i < len; i++) {
return array.Has(key); rv[i] = (byte[])array.Get_at(i);
}
return rv;
} }
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;
} }

View File

@ -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);
} }
// /** // /**

View File

@ -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.

View File

@ -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.

View File

@ -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;

View File

@ -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

View File

@ -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,120 +41,129 @@ 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 * See InterwikiLookup::fetch
// * 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 Interwiki|null|boolean * @return Interwiki|null|boolean
// */ */
// public function fetch($prefix) { public XomwInterwiki fetch(byte[] prefix) {
// if ($prefix == '') { if (prefix == Bry_.Empty) {
// return null; return null;
// } }
//
// if (!this.isValidInterwiki($prefix)) { if (!this.isValidInterwiki(prefix)) {
// return false; return null;
// } }
//
// return this.interwikiMap[$prefix]; return (XomwInterwiki)this.interwikiMap.Get_by(prefix);
// } }
//
// /** /**
// * See InterwikiLookup::getAllPrefixes * See InterwikiLookup::getAllPrefixes
// * *
// * @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 byte[][] getAllPrefixes(boolean local) {
// if ($local === null) { if (!local) {
// return array_keys(this.getInterwikiMap()); XophpArray.array_keys_bry(this.getInterwikiMap());
// } }
// $res = []; List_adp res = List_adp_.New();
// foreach (this.getInterwikiMap() as $interwikiId => $interwiki) { Ordered_hash hash = this.getInterwikiMap();
// if ($interwiki->isLocal() === $local) { int len = hash.Len();
// $res[] = $interwikiId; for (int i = 0; i < len; i++) {
// } XomwInterwiki interwiki = (XomwInterwiki)hash.Get_at(i);
// } if (interwiki.isLocal() == local) {
// return $res; res.Add(interwiki.interwikiId);
// } }
// }
// /** return (byte[][])res.To_ary_and_clear(byte[].class);
// * See InterwikiLookup::invalidateCache }
// *
// * @param String $prefix // /**
// */ // * See InterwikiLookup::invalidateCache
// public function invalidateCache($prefix) { // *
// if (!isset(this.interwikiMap[$prefix])) { // * @param String $prefix
// return; // */
// } // public function invalidateCache($prefix) {
// $globalId = this.interwikiMap[$prefix]->getWikiID(); // if (!isset(this.interwikiMap[$prefix])) {
// unset(this.interwikiMap[$prefix]); // return;
// // }
// // Reload the interwiki // $globalId = this.interwikiMap[$prefix].getWikiID();
// $site = this.siteLookup->getSites()->getSite($globalId); // unset(this.interwikiMap[$prefix]);
// $interwikis = this.getSiteInterwikis($site); //
// this.interwikiMap = array_merge(this.interwikiMap, [ $interwikis[$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 * 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 function getSiteInterwikis(Site $site) { private XomwInterwiki[] getSiteInterwikis(XomwSite site) {
// $interwikis = []; Ordered_hash interwikis = Ordered_hash_.New();
// foreach ($site->getInterwikiIds() as $interwiki) { Ordered_hash hash = site.getInterwikiIds();
// $url = $site->getPageUrl(); int len = hash.Len();
// if ($site instanceof MediaWikiSite) { for (int i = 0; i < len; i++) {
// $path = $site->getFileUrl('api.php'); String interwiki = (String)hash.Get_at(i);
// } else { String url = site.getPageUrl();
// $path = ''; String path = null;
// } if (Type_adp_.Eq_typeSafe(site, XomwMediaWikiSite.class)) {
// $local = $site->getSource() === 'local'; path = ((XomwMediaWikiSite)site).getFileUrl("api.php");
// // TODO: How to adapt trans? } else {
// $interwikis[$interwiki] = new Interwiki( path = "";
// $interwiki, }
// $url, boolean local = String_.Eq(site.getSource(), "local");
// $path, // TODO: How to adapt trans?
// $site->getGlobalId(), interwikis.Add(interwiki, new XomwInterwiki(
// $local Bry_.new_u8(interwiki),
// ); Bry_.new_u8(url),
// } Bry_.new_u8(path),
// return $interwikis; Bry_.new_u8(site.getGlobalId()),
// } local
, false
));
}
return (XomwInterwiki[])interwikis.To_ary_and_clear(XomwInterwiki.class);
}
} }

View File

@ -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);

View 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();

View File

@ -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.
} }

View File

@ -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);