1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2025-05-30 14:04:56 +00:00

Parser: Do not assume that Name_ui_w_colon matches Name [#594]

This commit is contained in:
gnosygnu 2019-10-13 11:30:40 -04:00
parent eac055214c
commit c67970b5b9
5 changed files with 43 additions and 20 deletions

View File

@ -108,7 +108,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
name_bgn = 0;
}
Object ns_eval = wiki.Ns_mgr().Names_get_w_colon(name_ary, 0, name_ary_len); // match {{:Portal or {{:Wikipedia
Xow_ns_mgr_name_itm ns_eval = wiki.Ns_mgr().Names_get_w_colon_or_null(name_ary, 0, name_ary_len); // match {{:Portal or {{:Wikipedia
if (ns_eval != null && !template_prefix_found) // do not transclude ns if Template prefix seen earlier; EX: {{Template:Wikipedia:A}} should not transclude "Wikipedia:A"; DATE:2013-04-03
return SubEval(ctx, wiki, bfr, name_ary, caller, src);
@ -156,9 +156,9 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
else { // colon present;
name_ary = Bry_.Mid(name_ary, finder_subst_end + 1, name_ary_len); // chop off "raw"; +1 is for ":"; note that +1 is in bounds b/c raw_colon was found
name_ary_len = name_ary.length;
Object ns_eval2 = wiki.Ns_mgr().Names_get_w_colon(name_ary, 0, name_ary_len); // match {{:Portal or {{:Wikipedia
Xow_ns_mgr_name_itm ns_eval2 = wiki.Ns_mgr().Names_get_w_colon_or_null(name_ary, 0, name_ary_len); // match {{:Portal or {{:Wikipedia
if (ns_eval2 != null) {
Xow_ns ns_eval_itm = (Xow_ns)ns_eval2;
Xow_ns ns_eval_itm = ns_eval2.Ns();
int pre_len = ns_eval_itm.Name_enc().length;
if (pre_len < name_ary_len && name_ary[pre_len] == Byte_ascii.Colon)
return SubEval(ctx, wiki, bfr, name_ary, caller, src);

View File

@ -102,14 +102,15 @@ public class Xowd_page_itm {
}
public Xowd_page_itm Ttl_(byte[] v, Xow_ns_mgr ns_mgr) {
ttl_full_db = v;
Object o = ns_mgr.Names_get_w_colon(v, 0, v.length);
if (o == null) {
Xow_ns_mgr_name_itm name_itm = ns_mgr.Names_get_w_colon_or_null(v, 0, v.length);
if (name_itm == null) {
ns = ns_mgr.Ns_main();
ttl_page_db = v;
}
else {
ns = (Xow_ns)o;
ttl_page_db = Bry_.Mid(v, ns.Name_ui_w_colon().length, v.length); // EX: "Template:A" -> "Template:" + "A"
ns = name_itm.Ns();
byte[] ns_name_bry = name_itm.Name();
ttl_page_db = Bry_.Mid(v, ns_name_bry.length + 1, v.length); // EX: "Template:A" -> "Template:" + "A"
}
ns_id = ns.Id();
return this;

View File

@ -23,6 +23,7 @@ public class Xowd_page_itm_tst {
}
}
class Xowd_page_itm_fxt {
private Xow_ns_mgr ns_mgr; Xowd_page_itm tmp_page;
public void Init() {
if (ns_mgr == null) {
ns_mgr = new Xow_ns_mgr(gplx.xowa.langs.cases.Xol_case_mgr_.A7());
@ -31,7 +32,7 @@ class Xowd_page_itm_fxt {
ns_mgr.Init_w_defaults();
tmp_page = new Xowd_page_itm();
}
} private Xow_ns_mgr ns_mgr; Xowd_page_itm tmp_page;
}
public void Test_ttl_(String ttl, int expd_ns, String expd_ttl) {
tmp_page.Ttl_(Bry_.new_a7(ttl), ns_mgr);
Tfds.Eq(expd_ns, tmp_page.Ns_id());

View File

@ -68,11 +68,12 @@ public class Xow_ns_mgr implements Gfo_invk, gplx.core.lists.ComparerAble {
Xow_ns rv = this.Names_get_or_null(name_bry, 0, name_bry.length);
return rv == null ? this.Ns_main() : rv;
}
public Object Names_get_w_colon(byte[] src, int bgn, int end) { // NOTE: get ns for a name with a ":"; EX: "Template:A" should return "Template" ns
public Xow_ns_mgr_name_itm Names_get_w_colon_or_null(byte[] src, int bgn, int end) { // NOTE: get ns for a name with a ":"; EX: "Template:A" should return "Template" ns
int colon_pos = Bry_find_.Find_fwd(src, Byte_ascii.Colon, bgn, end);
if (colon_pos == Bry_find_.Not_found) return null; // name does not have ":"; return;
Object rv = name_hash.Get_by_mid(src, bgn, colon_pos);
return rv == null ? null : ((Xow_ns_mgr_name_itm)rv).Ns();
return (colon_pos == Bry_find_.Not_found)
? (Xow_ns_mgr_name_itm)null // name does not have ":"; return null;
: (Xow_ns_mgr_name_itm)name_hash.Get_by_mid(src, bgn, colon_pos) // NOTE: can return NULL
;
}
public int Tmpls_get_w_colon(byte[] src, int bgn, int end) { // NOTE: get length of template name with a ":"; EX: "Template:A" returns 10; PERF
int colon_pos = Bry_find_.Find_fwd(src, Byte_ascii.Colon, bgn, end);
@ -128,7 +129,7 @@ public class Xow_ns_mgr implements Gfo_invk, gplx.core.lists.ComparerAble {
ns.Name_bry_(Bry_.Replace(ns_name, Project_talk_fmt_arg, project_ns.Name_db()));
} private static final byte[] Project_talk_fmt_arg = Bry_.new_a7("$1");
private void Rebuild_hashes__add(Hash_adp_bry hash, Xow_ns ns, byte[] key) {
Xow_ns_mgr_name_itm ns_itm = new Xow_ns_mgr_name_itm(key, ns);
Xow_ns_mgr_name_itm ns_itm = new Xow_ns_mgr_name_itm(ns, key);
hash.Add_if_dupe_use_nth(key, ns_itm);
if (Bry_find_.Find_fwd(key, Byte_ascii.Underline) != Bry_find_.Not_found) // ns has _; add another entry for space; EX: Help_talk -> Help talk
hash.Add_if_dupe_use_nth(Bry_.Replace(key, Byte_ascii.Underline, Byte_ascii.Space), ns_itm);
@ -164,7 +165,7 @@ public class Xow_ns_mgr implements Gfo_invk, gplx.core.lists.ComparerAble {
if (!id_hash.Has(id_hash_ref.Val_(ns_id))) // NOTE: do not add if already exists; avoids alias
id_hash.Add(Int_obj_ref.New(ns.Id()), ns);
}
name_hash.Add_if_dupe_use_nth(ns.Name_db(), new Xow_ns_mgr_name_itm(ns.Name_db(), ns));
name_hash.Add_if_dupe_use_nth(ns.Name_db(), new Xow_ns_mgr_name_itm(ns, ns.Name_db()));
return this;
}
public int compare(Object lhsObj, Object rhsObj) {
@ -235,12 +236,6 @@ public class Xow_ns_mgr implements Gfo_invk, gplx.core.lists.ComparerAble {
bfr.Add(ttl);
return bfr.To_bry_and_clear();
}
class Xow_ns_mgr_name_itm {
public Xow_ns_mgr_name_itm(byte[] name, Xow_ns ns) {this.name = name; this.name_len = name.length; this.ns = ns;}
public byte[] Name() {return name;} private byte[] name;
public int Name_len() {return name_len;} private int name_len;
public Xow_ns Ns() {return ns;} private Xow_ns ns;
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_clear)) this.Clear();
// NOTE: called by /xowa/bin/any/xowa/cfg/wiki/core/*.gfs for (a) aliases; (b) Subpages_enabled

View File

@ -0,0 +1,26 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.wikis.nss; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
public class Xow_ns_mgr_name_itm {
public Xow_ns_mgr_name_itm(Xow_ns ns, byte[] name) {
this.ns = ns;
this.name = name;
this.name_len = name.length;
}
public Xow_ns Ns() {return ns;} private final Xow_ns ns;
public byte[] Name() {return name;} private final byte[] name;
public int Name_len() {return name_len;} private final int name_len;
}