From dcdc69e374c121ad9331890bfcfd586f11ddff46 Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Sat, 25 Mar 2017 08:54:59 -0400 Subject: [PATCH] Xomw: Implement Interwiki part of GetTitleCodec --- .../src/gplx/xowa/mediawiki/XomwEnv.java | 3 +- .../src/gplx/xowa/mediawiki/XophpArray.java | 15 +- .../includes/XomwMediaWikiServices.java | 6 +- .../xowa/mediawiki/includes/XomwMessage.java | 27 +- .../xowa/mediawiki/includes/XomwTitle.java | 56 ++--- .../includes/interwiki/XomwInterwiki.java | 2 + .../interwiki/XomwInterwikiLookup.java | 32 +-- .../interwiki/XomwInterwikiLookupAdapter.java | 234 +++++++++--------- .../includes/site/XomwMediaWikiSite.java | 3 +- .../mediawiki/includes/site/XomwSite.java | 1 + .../title/XomwMediaWikiTitleCodec.java | 148 +++++------ .../mediawiki/languages/XomwLanguage.java | 4 +- 12 files changed, 278 insertions(+), 253 deletions(-) diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/XomwEnv.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/XomwEnv.java index ffdce4ace..9aa1463ff 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/XomwEnv.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/XomwEnv.java @@ -32,7 +32,8 @@ public class XomwEnv { XomwLanguage language = new XomwLanguage(xoLang); XomwSiteLookup siteLookup = new XomwXowaSiteLookup(); 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(); diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/XophpArray.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/XophpArray.java index 4319c9170..7d4101a52 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/XophpArray.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/XophpArray.java @@ -25,12 +25,17 @@ public class XophpArray { } 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 byte[][] array_keys_bry(Ordered_hash array) { + int len = array.Len(); + byte[][] rv = new byte[len][]; + for (int i = 0; i < len; i++) { + 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) { return array.Len() == 0; } diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwMediaWikiServices.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwMediaWikiServices.java index 1eef32922..2a67e5f12 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwMediaWikiServices.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwMediaWikiServices.java @@ -35,9 +35,11 @@ public class XomwMediaWikiServices { private final XomwMediaWikiTitleCodec titleParser; 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.titleParser = new XomwMediaWikiTitleCodec(this, language); + this.titleParser = new XomwMediaWikiTitleCodec(this, language, localInterwikis); } // /** diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwMessage.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwMessage.java index fb5734b72..6be2e6b46 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwMessage.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwMessage.java @@ -737,17 +737,17 @@ public class XomwMessage { // $this->interface = false; // return $this; // } -// -// /** -// * Request the message in the wiki's content language, -// * unless it is disabled for this message. -// * -// * @since 1.17 -// * @see $wgForceUIMsgAsContentMsg -// * -// * @return Message $this -// */ -// public function inContentLanguage() { + + /** + * Request the message in the wiki's content language, + * unless it is disabled for this message. + * + * @since 1.17 + * @see $wgForceUIMsgAsContentMsg + * + * @return Message $this + */ + public XomwMessage inContentLanguage() { // global $wgForceUIMsgAsContentMsg; // if ( in_array( $this->key, (array)$wgForceUIMsgAsContentMsg ) ) { // return $this; @@ -756,8 +756,9 @@ public class XomwMessage { // global $wgContLang; // $this->inLanguage( $wgContLang ); // return $this; -// } -// + return this; + } + // /** // * Allows manipulating the interface message flag directly. // * Can be used to restore the flag after setting a language. diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwTitle.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwTitle.java index b275936b4..2914af350 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwTitle.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwTitle.java @@ -546,21 +546,21 @@ public class XomwTitle { // return null; // } // } -// -// /** -// * Create a new Title for the Main Page -// * -// * @return Title The new Object -// */ -// public static function newMainPage() { -// $title = Title::newFromText(wfMessage('mainpage').inContentLanguage().text()); -// // Don't give fatal errors if the message is broken -// if (!$title) { -// $title = Title::newFromText('Main Page'); -// } -// return $title; -// } -// + + /** + * Create a new Title for the Main Page + * + * @return Title The new Object + */ + public static XomwTitle newMainPage(XomwEnv env) { + XomwTitle title = XomwTitle.newFromText(env, XomwGlobalFunctions.wfMessage(env, "mainpage").inContentLanguage().text()); + // Don't give fatal errors if the message is broken + if (title == null) { + title = XomwTitle.newFromText(env, Bry_.new_a7("Main Page")); + } + return title; + } + // /** // * Get the prefixed DB key associated with an ID // * @@ -898,19 +898,19 @@ public class XomwTitle { return this.mDbkeyform; } -// /** -// * Get the DB key with the initial letter case as specified by the user -// * -// * @return String DB key -// */ -// function getUserCaseDBKey() { -// if (!is_null(this.mUserCaseDBKey)) { -// return this.mUserCaseDBKey; -// } else { -// // If created via makeTitle(), this.mUserCaseDBKey is not set. -// return this.mDbkeyform; -// } -// } + /** + * Get the DB key with the initial letter case as specified by the user + * + * @return String DB key + */ + public byte[] getUserCaseDBKey() { + if (this.mUserCaseDBKey != null) { + return this.mUserCaseDBKey; + } else { + // If created via makeTitle(), this.mUserCaseDBKey is not set. + return this.mDbkeyform; + } + } /** * Get the namespace index, i.e. one of the NS_xxxx constants. diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwiki.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwiki.java index 636e81031..974c02f2a 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwiki.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwiki.java @@ -39,6 +39,8 @@ public class XomwInterwiki { /** @var boolean Whether interwiki transclusions are allowed */ private boolean mTrans; + public byte[] interwikiId; + public XomwInterwiki(byte[] prefix, byte[] url, byte[] api, byte[] wikiId, boolean local, boolean trans) { this.mPrefix = prefix; this.mURL = url; diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwikiLookup.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwikiLookup.java index 21566f0f6..165f04b48 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwikiLookup.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwikiLookup.java @@ -28,22 +28,22 @@ public interface XomwInterwikiLookup { */ boolean isValidInterwiki(byte[] prefix); -// /** -// * Fetch an Interwiki Object -// * -// * @param String $prefix Interwiki prefix to use -// * @return Interwiki|null|boolean -// */ -// XomwInterwiki fetch(byte[] prefix); -// -// /** -// * Returns all interwiki prefixes -// * -// * @param String|null $local If set, limits output to local/non-local interwikis -// * @return String[] List of prefixes -// */ -// byte[][] getAllPrefixes(byte[] local); -// + /** + * Fetch an Interwiki Object + * + * @param String $prefix Interwiki prefix to use + * @return Interwiki|null|boolean + */ + XomwInterwiki fetch(byte[] prefix); + + /** + * Returns all interwiki prefixes + * + * @param String|null $local If set, limits output to local/non-local interwikis + * @return String[] List of prefixes + */ + byte[][] getAllPrefixes(boolean local); + // /** // * Purge the in-process and persistent Object cache for an interwiki prefix // * @param String $prefix diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwikiLookupAdapter.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwikiLookupAdapter.java index bb48ec255..9beaf903d 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwikiLookupAdapter.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/interwiki/XomwInterwikiLookupAdapter.java @@ -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); + } } diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/site/XomwMediaWikiSite.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/site/XomwMediaWikiSite.java index 7c8f40076..acd46fe28 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/site/XomwMediaWikiSite.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/site/XomwMediaWikiSite.java @@ -21,7 +21,7 @@ package gplx.xowa.mediawiki.includes.site; import gplx.*; import gplx.xowa.*; im * * @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"; /** @@ -187,6 +187,7 @@ class XomwMediaWikiSite extends XomwSite { private static final String PATH_FILE * * @return String */ + public String getFileUrl() {return getFileUrl(null);} public String getFileUrl(String path) { String filePath = this.getPath(XomwMediaWikiSite.PATH_FILE); diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/site/XomwSite.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/site/XomwSite.java index 0f0314e50..c85bf033b 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/site/XomwSite.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/site/XomwSite.java @@ -362,6 +362,7 @@ public class XomwSite { * * @return String|boolean */ + @gplx.Virtual public String getPageUrl() {return getPageUrl(null);} @gplx.Virtual public String getPageUrl(String pageName) { String url = this.getLinkPath(); diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/title/XomwMediaWikiTitleCodec.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/title/XomwMediaWikiTitleCodec.java index da6aea372..041035cb1 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/title/XomwMediaWikiTitleCodec.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/title/XomwMediaWikiTitleCodec.java @@ -27,27 +27,28 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter { // * @var GenderCache // */ // protected $genderCache; -// -// /** -// * @var String[] -// */ -// protected $localInterwikis; -// + + /** + * @var String[] + */ + private byte[][] localInterwikis; + // /** // * @param Language language The language Object to use for localizing 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, -// $localInterwikis = [] +// localInterwikis = [] // ) { -// $this->language = language; -// $this->genderCache = $genderCache; -// $this->localInterwikis = (array)$localInterwikis; +// $this.language = language; +// $this.genderCache = $genderCache; +// $this.localInterwikis = (array)localInterwikis; // } - public XomwMediaWikiTitleCodec(XomwMediaWikiServices mws, XomwLanguage language) { + public XomwMediaWikiTitleCodec(XomwMediaWikiServices mws, XomwLanguage language, byte[][] localInterwikis) { this.mws = mws; this.language = language; + this.localInterwikis = localInterwikis; } /** @@ -61,13 +62,13 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter { */ public byte[] getNamespaceName(int ns, byte[] text) { byte[] name = null; -// if ($this->language->needsGenderDistinction() && +// if ($this.language.needsGenderDistinction() && // XomwNamespace::hasGenderDistinction($namespace) // ) { // // // NOTE: we are assuming here that the title text is a user name! -// $gender = $this->genderCache->getGenderOf($text, __METHOD__); -// $name = $this->language->getGenderNsText($namespace, $gender); +// $gender = $this.genderCache.getGenderOf($text, __METHOD__); +// $name = $this.language.getGenderNsText($namespace, $gender); // } else { name = language.getNsText(ns); // } @@ -93,7 +94,7 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter { // */ // public function formatTitle($namespace, $text, $fragment = '', $interwiki = '') { // if ($namespace !== false) { -// $namespace = $this->getNamespaceName($namespace, $text); +// $namespace = $this.getNamespaceName($namespace, $text); // // if ($namespace !== '') { // $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 // // code for parsing with the old Title class. The parser code should // // be refactored to avoid this. -// $parts = $this->splitTitleString($text, $defaultNamespace); +// $parts = $this.splitTitleString($text, $defaultNamespace); // // // Relative fragment links are not supported by TitleValue // if ($parts['dbkey'] === '') { @@ -147,10 +148,10 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter { // * // * @param LinkTarget $title // * -// * @return String $title->getText() +// * @return String $title.getText() // */ // 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 // */ // public function getPrefixedText(LinkTarget $title) { -// return $this->formatTitle( -// $title->getNamespace(), -// $title->getText(), +// return $this.formatTitle( +// $title.getNamespace(), +// $title.getText(), // '', -// $title->getInterwiki() +// $title.getInterwiki() // ); // } // @@ -177,25 +178,25 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter { // */ // public function getPrefixedDBkey(LinkTarget $target) { // $key = ''; -// if ($target->isExternal()) { -// $key .= $target->getInterwiki() . ':'; +// if ($target.isExternal()) { +// $key .= $target.getInterwiki() . ':'; // } // // Try to get a namespace name, but fallback // // to empty String if it doesn't exist // try { -// $nsName = $this->getNamespaceName( -// $target->getNamespace(), -// $target->getText() +// $nsName = $this.getNamespaceName( +// $target.getNamespace(), +// $target.getText() // ); // } catch (InvalidArgumentException $e) { // $nsName = ''; // } // -// if ($target->getNamespace() !== 0) { +// if ($target.getNamespace() !== 0) { // $key .= $nsName . ':'; // } // -// $key .= $target->getText(); +// $key .= $target.getText(); // // return strtr($key, ' ', '_'); // } @@ -208,11 +209,11 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter { // * @return String // */ // public function getFullText(LinkTarget $title) { -// return $this->formatTitle( -// $title->getNamespace(), -// $title->getText(), -// $title->getFragment(), -// $title->getInterwiki() +// return $this.formatTitle( +// $title.getNamespace(), +// $title.getText(), +// $title.getFragment(), +// $title.getInterwiki() // ); // } @@ -301,43 +302,46 @@ public class XomwMediaWikiTitleCodec implements XomwTitleFormatter { } } } -// else if (Interwiki::isValidInterwiki($p)) { -// // Interwiki link -// dbkey = $m[2]; -// parts['interwiki'] = this.language->lc($p); -// -// // Redundant interwiki prefix to the local wiki -// foreach (this.localInterwikis as $localIW) { -// if (0 == strcasecmp(parts['interwiki'], $localIW)) { -// if (dbkey == '') { -// // Empty self-links should point to the Main Page, to ensure -// // compatibility with cross-wiki transclusions and the like. -// $mainPage = Title::newMainPage(); -// return [ -// 'interwiki' => $mainPage->getInterwiki(), -// 'local_interwiki' => true, -// 'fragment' => $mainPage->getFragment(), -// 'namespace' => $mainPage->getNamespace(), -// 'dbkey' => $mainPage->getDBkey(), -// 'user_case_dbkey' => $mainPage->getUserCaseDBKey() -// ]; -// } -// parts['interwiki'] = ''; -// // local interwikis should behave like initial-colon links -// parts['local_interwiki'] = true; -// -// // Do another namespace split... -// continue 2; -// } -// } -// -// // If there's an initial colon after the interwiki, that also -// // resets the default namespace -// if (dbkey !== '' && dbkey[0] == ':') { -// parts['namespace'] = NS_MAIN; -// dbkey = substr(dbkey, 1); -// } -// } + else if (XomwInterwiki.isValidInterwiki(mws, p)) { + // Interwiki link + dbkey = m[2]; + parts.interwiki = this.language.lc(p); + + // Redundant interwiki prefix to the local wiki + boolean doAnotherNamespaceSplit = false; + for (byte[] localIW : this.localInterwikis) { + if (Bry_.Eq(parts.interwiki, localIW)) { + if (Bry_.Len_eq_0(dbkey)) { + // Empty self-links should point to the Main Page, to ensure + // compatibility with cross-wiki transclusions and the like. + XomwTitle mainPage = XomwTitle.newMainPage(mws.env); + XomwMediaWikiTitleCodecParts rv = new XomwMediaWikiTitleCodecParts(mainPage.getDBkey(), mainPage.getNamespace()); + rv.interwiki = mainPage.getInterwiki(); + rv.local_interwiki = true; + rv.fragment = mainPage.getFragment(); + // rv.ns = mainPage.getNamespace(); + // rv.dbkey = mainPage.getDBkey(); + rv.user_case_dbkey = mainPage.getUserCaseDBKey(); + } + parts.interwiki = Bry_.Empty; + // local interwikis should behave like initial-colon links + parts.local_interwiki = true; + + // Do another namespace split... + doAnotherNamespaceSplit = true; + break; + } + } + if (doAnotherNamespaceSplit) + continue; + + // If there's an initial colon after the interwiki, that also + // 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, // then let the colon expression be part of the title. } diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/languages/XomwLanguage.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/languages/XomwLanguage.java index 08a637fe6..f570f4f22 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/languages/XomwLanguage.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/languages/XomwLanguage.java @@ -2729,8 +2729,8 @@ public class XomwLanguage { * @param boolean $first * @return mixed|String */ - private byte[] lc(byte[] str) {return lc(str, false);} - private byte[] lc(byte[] str, boolean first) { + public byte[] lc(byte[] str) {return lc(str, false);} + public byte[] lc(byte[] str, boolean first) { return first ? xoLang.Case_mgr().Case_build_1st_lower(tmpBfr, str, 0, str.length) : xoLang.Case_mgr().Case_build_lower (str, 0, str.length);