1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00

'v3.7.2.1'

This commit is contained in:
gnosygnu
2016-07-10 23:35:32 -04:00
parent f5f48bb9b1
commit b333db45f8
366 changed files with 4468 additions and 3460 deletions

View File

@@ -18,29 +18,33 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers; import gplx.*; import gplx.xowa.*;
import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.htmls.*; import gplx.xowa.parsers.uniqs.*;
public class Xoa_parser_mgr {
private final Mwh_doc_wkr__atr_bldr atr_bldr = new Mwh_doc_wkr__atr_bldr();
public Xop_tkn_mkr Tkn_mkr() {return tkn_mkr;} private final Xop_tkn_mkr tkn_mkr = new Xop_tkn_mkr();
public Xop_uniq_mgr Core__uniq_mgr() {return core__uniq_mgr;} private final Xop_uniq_mgr core__uniq_mgr = new Xop_uniq_mgr();
public Mwh_atr_parser Xnde__atr_parser() {return atr_parser;} private final Mwh_atr_parser atr_parser = new Mwh_atr_parser();
private final Mwh_doc_wkr__atr_bldr atr_bldr = new Mwh_doc_wkr__atr_bldr();
public Xop_tkn_mkr Tkn_mkr() {return tkn_mkr;} private final Xop_tkn_mkr tkn_mkr = new Xop_tkn_mkr();
public Xop_uniq_mgr Core__uniq_mgr() {return core__uniq_mgr;} private final Xop_uniq_mgr core__uniq_mgr = new Xop_uniq_mgr();
public Mwh_atr_parser Xnde__atr_parser() {return atr_parser;} private final Mwh_atr_parser atr_parser = new Mwh_atr_parser();
public Mwh_atr_itm[] Xnde__parse_atrs(byte[] src, int src_bgn, int src_end) {
// if (src_bgn < src_end) { // CHART
// src = Bry_.Mid(src, src_bgn, src_end);
// src = gplx.xowa.parsers.xndes.Xop_xnde_tkn.uniq_mgr.Parse(src);
// src_bgn = 0;
// src_end = src.length;
// }
atr_parser.Parse(atr_bldr, -1, -1, src, src_bgn, src_end);
return atr_bldr.To_atr_ary();
synchronized (atr_bldr) {// LOCK:app-level; DATE:2016-07-06
//if (src_bgn < src_end) { // CHART
// src = Bry_.Mid(src, src_bgn, src_end);
// src = gplx.xowa.parsers.xndes.Xop_xnde_tkn.uniq_mgr.Parse(src);
// src_bgn = 0;
// src_end = src.length;
//}
atr_parser.Parse(atr_bldr, -1, -1, src, src_bgn, src_end);
return atr_bldr.To_atr_ary();
}
}
public Mwh_atr_itm[] Xnde__parse_atrs_for_tblw(byte[] src, int src_bgn, int src_end) {
// int angle_bgn_pos = Bry_find_.Find_fwd(src, Byte_ascii.Angle_bgn, src_bgn, src_end);
// if (angle_bgn_pos != Bry_find_.Not_found) {
// src = Bry_.Mid(src, src_bgn, src_end);
// src = Bry_.Replace(src, Byte_ascii.Angle_bgn_bry, gplx.langs.htmls.Gfh_entity_.Lt_bry);
// src_bgn = 0;
// src_end = src.length;
// }
atr_parser.Parse(atr_bldr, -1, -1, src, src_bgn, src_end);
return atr_bldr.To_atr_ary();
synchronized (atr_bldr) { // LOCK:app-level; DATE:2016-07-06
//int angle_bgn_pos = Bry_find_.Find_fwd(src, Byte_ascii.Angle_bgn, src_bgn, src_end);
//if (angle_bgn_pos != Bry_find_.Not_found) {
// src = Bry_.Mid(src, src_bgn, src_end);
// src = Bry_.Replace(src, Byte_ascii.Angle_bgn_bry, gplx.langs.htmls.Gfh_entity_.Lt_bry);
// src_bgn = 0;
// src_end = src.length;
//}
atr_parser.Parse(atr_bldr, -1, -1, src, src_bgn, src_end);
return atr_bldr.To_atr_ary();
}
}
}

View File

@@ -24,14 +24,15 @@ import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xo
import gplx.xowa.parsers.logs.*; import gplx.xowa.htmls.modules.popups.keeplists.*;
public class Xop_ctx {
private Xop_ctx_wkr[] wkrs = new Xop_ctx_wkr[] {};
Xop_ctx(Xowe_wiki wiki, Xoae_page page) {
Xop_ctx(Xowe_wiki wiki, Xow_parser_mgr parser_mgr, Xoae_page page) {
this.app = wiki.Appe(); this.msg_log = app.Msg_log(); this.tkn_mkr = app.Parser_mgr().Tkn_mkr();
this.wiki = wiki; this.cur_page = page; this.lang = wiki.Lang();
this.parser_mgr = parser_mgr;
this.wkrs = new Xop_ctx_wkr[] {para, apos, xnde, list, lnki, hdr, amp, lnke, tblw, invk};
for (Xop_ctx_wkr wkr : wkrs) wkr.Ctor_ctx(this);
this.xnde_tag_regy = wiki.Mw_parser_mgr().Xnde_tag_regy();
}
// public boolean Scribunto; // CHART
// public boolean Scribunto; // CHART
public Xoae_app App() {return app;} private final Xoae_app app;
public Xowe_wiki Wiki() {return wiki;} private final Xowe_wiki wiki;
public Xol_lang_itm Lang() {return lang;} private final Xol_lang_itm lang;
@@ -51,6 +52,7 @@ public class Xop_ctx {
public Xot_invk_wkr Invk() {return invk;} private final Xot_invk_wkr invk = new Xot_invk_wkr();
public Xop_curly_wkr Curly() {return curly;} private final Xop_curly_wkr curly = new Xop_curly_wkr();
public Xop_xnde_tag_regy Xnde_tag_regy() {return xnde_tag_regy;} private final Xop_xnde_tag_regy xnde_tag_regy; // PERF:demeter
public Xow_parser_mgr Parser_mgr() {return parser_mgr;} private Xow_parser_mgr parser_mgr;
public boolean Tmpl_load_enabled() {return tmpl_load_enabled;} public void Tmpl_load_enabled_(boolean v) {tmpl_load_enabled = v;} private boolean tmpl_load_enabled = true;
public int Tmpl_tkn_max() {return tmpl_tkn_max;} public void Tmpl_tkn_max_(int v) {tmpl_tkn_max = v;} private int tmpl_tkn_max = Int_.Max_value;
@@ -304,23 +306,24 @@ public class Xop_ctx {
if (stack_pos == -1) return;
ctx.Stack_pop_til(root, src, stack_pos, true, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_txt);
}
public static Xop_ctx new_main_page(Xowe_wiki wiki) {return new_(wiki, Xoa_page_.Main_page_bry);} // HACK: use "Main_Page" to put in valid page title
public static Xop_ctx new_(Xowe_wiki wiki, byte[] ttl_bry) {return new Xop_ctx(wiki, Xoae_page.New(wiki, wiki.Ttl_parse(ttl_bry)));}
public static Xop_ctx new_sub_(Xowe_wiki wiki) {return new_sub_(wiki, wiki.Parser_mgr().Ctx().cur_page);}
public static Xop_ctx new_sub_(Xowe_wiki wiki, Xoae_page page) { // TODO_OLD: new_sub_ should reuse ctx's page; callers who want new_page should call new_sub_page_; DATE:2014-04-10
Xop_ctx rv = new Xop_ctx(wiki, page);
new_copy(wiki.Parser_mgr().Ctx(), rv);
public static Xop_ctx new_main_page(Xowe_wiki wiki) {return new_(wiki, wiki.Parser_mgr(), Xoa_page_.Main_page_bry);} // HACK: use "Main_Page" to put in valid page title
public static Xop_ctx new_(Xowe_wiki wiki, Xow_parser_mgr parser_mgr, byte[] ttl_bry) {return new Xop_ctx(wiki, parser_mgr, Xoae_page.New(wiki, wiki.Ttl_parse(ttl_bry)));}
public static Xop_ctx new_sub_(Xop_ctx ctx) {return new_sub_(ctx.wiki, ctx, ctx.cur_page);}
public static Xop_ctx new_sub_(Xowe_wiki wiki, Xop_ctx ctx) {return new_sub_(wiki, ctx, ctx.cur_page);}
public static Xop_ctx new_sub_(Xowe_wiki wiki, Xop_ctx ctx, Xoae_page page) { // TODO_OLD: new_sub_ should reuse ctx's page; callers who want new_page should call new_sub_page_; DATE:2014-04-10
Xop_ctx rv = new Xop_ctx(wiki, ctx.parser_mgr, page);
new_copy(ctx, rv);
return rv;
}
public static Xop_ctx new_sub_page_(Xowe_wiki wiki, Xop_ctx ctx, Hash_adp_bry lst_page_regy) {
Xop_ctx rv = new Xop_ctx(wiki, ctx.cur_page);
Xop_ctx rv = new Xop_ctx(wiki, ctx.parser_mgr, ctx.cur_page);
new_copy(ctx, rv);
rv.lst_page_regy = lst_page_regy; // NOTE: must share ref for lst only (do not share for sub_(), else stack overflow)
return rv;
}
public static Xop_ctx New_sub_by_ctx(Xop_ctx ctx) {
Xowe_wiki wiki = ctx.Wiki();
Xop_ctx rv = new Xop_ctx(wiki, Xoae_page.New(wiki, wiki.Ttl_parse(ctx.Page().Ttl().Full_db())));
Xop_ctx rv = new Xop_ctx(wiki, ctx.parser_mgr, Xoae_page.New(wiki, wiki.Ttl_parse(ctx.Page().Ttl().Full_db())));
new_copy(ctx, rv);
return rv;
}

View File

@@ -20,15 +20,15 @@ import gplx.core.btries.*;
import gplx.xowa.langs.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.wikis.nss.*;
import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.tmpls.*;
public class Xop_parser { // NOTE: parsers are reused; do not keep any read-write state
private final Xowe_wiki wiki;
private final Btrie_fast_mgr tmpl_trie, wtxt_trie;
private final Xowe_wiki wiki;
private final Btrie_fast_mgr tmpl_trie, wtxt_trie;
Xop_parser(Xowe_wiki wiki, Xop_lxr_mgr tmpl_lxr_mgr, Xop_lxr_mgr wtxt_lxr_mgr) {
this.wiki = wiki;
this.tmpl_lxr_mgr = tmpl_lxr_mgr; this.tmpl_trie = tmpl_lxr_mgr.Trie();
this.wtxt_lxr_mgr = wtxt_lxr_mgr; this.wtxt_trie = wtxt_lxr_mgr.Trie();
}
public Xop_lxr_mgr Tmpl_lxr_mgr() {return tmpl_lxr_mgr;} private final Xop_lxr_mgr tmpl_lxr_mgr;
public Xop_lxr_mgr Wtxt_lxr_mgr() {return wtxt_lxr_mgr;} private final Xop_lxr_mgr wtxt_lxr_mgr;
public Xop_lxr_mgr Tmpl_lxr_mgr() {return tmpl_lxr_mgr;} private final Xop_lxr_mgr tmpl_lxr_mgr;
public Xop_lxr_mgr Wtxt_lxr_mgr() {return wtxt_lxr_mgr;} private final Xop_lxr_mgr wtxt_lxr_mgr;
public void Init_by_wiki(Xowe_wiki wiki) {
tmpl_lxr_mgr.Init_by_wiki(wiki);
wtxt_lxr_mgr.Init_by_wiki(wiki);
@@ -44,7 +44,7 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ
}
public void Parse_text_to_html(Bry_bfr trg, Xoae_page page, boolean para_enabled, byte[] src) {Parse_text_to_html(trg, page, Xoh_wtr_ctx.Basic, para_enabled, src);}
public void Parse_text_to_html(Bry_bfr trg, Xoae_page page, Xoh_wtr_ctx hctx, boolean para_enabled, byte[] src) {
Xop_ctx ctx = Xop_ctx.new_sub_(wiki, page);
Xop_ctx ctx = Xop_ctx.new_sub_(wiki, wiki.Parser_mgr().Ctx(), page);
Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr();
Xop_root_tkn root = tkn_mkr.Root(src);
Xop_parser parser = wiki.Parser_mgr().Main();
@@ -73,7 +73,7 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ
ctx.Page().Clear_all(); ctx.App().Msg_log().Clear();
Parse_text_to_wdom(root, ctx, tkn_mkr, src, Xop_parser_.Doc_bgn_bos);
}
public Xop_root_tkn Parse_text_to_wdom_old_ctx(Xop_ctx old_ctx, byte[] src, boolean doc_bgn_pos) {return Parse_text_to_wdom(Xop_ctx.new_sub_(old_ctx.Wiki()), src, doc_bgn_pos);}
public Xop_root_tkn Parse_text_to_wdom_old_ctx(Xop_ctx old_ctx, byte[] src, boolean doc_bgn_pos) {return Parse_text_to_wdom(Xop_ctx.new_sub_(old_ctx), src, doc_bgn_pos);}
public Xop_root_tkn Parse_text_to_wdom(Xop_ctx new_ctx, byte[] src, boolean doc_bgn_pos) {
new_ctx.Para().Enabled_n_();
Xop_tkn_mkr tkn_mkr = new_ctx.Tkn_mkr();
@@ -92,7 +92,7 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ
ctx.Parse_tid_(parse_tid_old);
}
public byte[] Parse_text_to_wtxt(byte[] src) {
Xop_ctx ctx = Xop_ctx.new_sub_(wiki);
Xop_ctx ctx = Xop_ctx.new_sub_(wiki.Parser_mgr().Ctx());
Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr();
Xop_root_tkn root = tkn_mkr.Root(src);
return wiki.Parser_mgr().Main().Parse_text_to_wtxt(root, ctx, tkn_mkr, src);
@@ -121,16 +121,18 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ
public int Parse_to_src_end(Xop_root_tkn root, Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, byte[] src, Btrie_fast_mgr trie, int pos, int len) {
byte b = pos == -1 ? Byte_ascii.Nl : src[pos]; // simulate newLine at bgn of src; needed for lxrs which rely on \n (EX: "=a=")
int txt_bgn = pos == -1 ? 0 : pos; Xop_tkn_itm txt_tkn = null;
Btrie_rv trv = new Btrie_rv();
while (true) {
Object o = trie.Match_bgn_w_byte(b, src, pos, len);
Object o = trie.Match_at_w_b0(trv, b, src, pos, len);
Xop_lxr lxr = null;
if (o == null) // no lxr found; char is txt; increment pos
pos++;
else { // lxr found
Xop_lxr lxr = (Xop_lxr)o;
lxr = (Xop_lxr)o;
if (txt_bgn != pos) // chars exist between pos and txt_bgn; make txt_tkn; see NOTE_1
txt_tkn = Txt_add(ctx, tkn_mkr, root, txt_tkn, txt_bgn, pos);
ctx.Lxr_make_(true);
pos = lxr.Make_tkn(ctx, tkn_mkr, root, src, len, pos, trie.Match_pos());
pos = lxr.Make_tkn(ctx, tkn_mkr, root, src, len, pos, trv.Pos());
if (ctx.Lxr_make()) {txt_bgn = pos; txt_tkn = null;} // reset txt_tkn
}
if (pos == len) break;
@@ -143,9 +145,11 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ
byte b = pos == -1 ? Byte_ascii.Nl : src[pos]; // simulate \n at bgn of src; needed for lxrs which rely on \n (EX: "=a=")
int txt_bgn = pos == -1 ? 0 : pos; Xop_tkn_itm txt_tkn = null;
Xop_lxr lxr = null;
Btrie_rv trv = new Btrie_rv();
while (true) {
lxr = null;
Object o = trie.Match_bgn_w_byte(b, src, pos, src_len);
Object o = trie.Match_at_w_b0(trv, b, src, pos, src_len);
if (o == null) // no lxr found; char is txt; increment pos
pos++;
else { // lxr found
@@ -153,7 +157,7 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ
if (txt_bgn != pos) // chars exist between pos and txt_bgn; make txt_tkn; see NOTE_1
txt_tkn = Txt_add(ctx, tkn_mkr, root, txt_tkn, txt_bgn, pos);
ctx.Lxr_make_(true);
pos = lxr.Make_tkn(ctx, tkn_mkr, root, src, src_len, pos, trie.Match_pos());
pos = lxr.Make_tkn(ctx, tkn_mkr, root, src, src_len, pos, trv.Pos());
if (ctx.Lxr_make()) {txt_bgn = pos; txt_tkn = null;} // reset txt_tkn
}
if ( pos >= end

View File

@@ -22,7 +22,7 @@ public class Xop_parser_ {
public static final int Doc_bgn_bos = -1, Doc_bgn_char_0 = 0;
public static byte[] Parse_text_to_html(Xowe_wiki wiki, Xoae_page page, Xoa_ttl ttl, byte[] src, boolean para_enabled) { // NOTE: must pass in same page instance; do not do Xoa_page_.new_(), else img_idx will get reset to 0; DATE:2015-02-08
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
Xop_ctx ctx = Xop_ctx.new_sub_(wiki, page);
Xop_ctx ctx = Xop_ctx.new_sub_(wiki, wiki.Parser_mgr().Ctx(), page);
Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr();
Xop_root_tkn root = tkn_mkr.Root(src);
Xop_parser parser = wiki.Parser_mgr().Main();

View File

@@ -17,6 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.parsers; import gplx.*; import gplx.xowa.*;
import gplx.xowa.wikis.*; import gplx.core.envs.*;
import gplx.xowa.xtns.scribunto.*;
public class Xow_parser_mgr {
private final Xowe_wiki wiki; private final Xop_tkn_mkr tkn_mkr;
private Xop_parser anchor_encode_parser;
@@ -27,6 +28,7 @@ public class Xow_parser_mgr {
}
public Xop_ctx Ctx() {return ctx;} private final Xop_ctx ctx;
public Xop_parser Main() {return main;} private final Xop_parser main;
public Scrib_core_mgr Scrib() {return scrib;} private final Scrib_core_mgr scrib = new Scrib_core_mgr();
public Xop_parser Anchor_encoder() {
if (anchor_encode_parser == null) {
anchor_encode_parser = Xop_parser.new_(wiki, wiki.Parser_mgr().Main().Tmpl_lxr_mgr(), Xop_lxr_mgr.new_anchor_encoder());
@@ -37,20 +39,16 @@ public class Xow_parser_mgr {
}
public void Parse(Xoae_page page, boolean clear) {
if (!Env_.Mode_testing()) wiki.Init_assert();
gplx.xowa.xtns.scribunto.Scrib_core.Core_page_changed(page); // notify scribunto about page changed
page.Wikie().Parser_mgr().Scrib().Core_page_changed(page); // notify scribunto about page changed
ctx.Page_(page);
Xop_root_tkn root = ctx.Tkn_mkr().Root(page.Data_raw());
Xop_root_tkn root = ctx.Tkn_mkr().Root(page.Db().Text().Text_bry());
if (clear) {page.Clear_all();}
Xoa_ttl ttl = page.Ttl();
if ( Xow_page_tid.Identify(wiki.Domain_tid(), ttl.Ns().Id(), ttl.Page_db()) == Xow_page_tid.Tid_wikitext) { // only parse page if wikitext; skip .js, .css, Module; DATE:2013-11-10
byte[] data_raw = page.Data_raw();
// if (wiki.Domain_tid() == gplx.xowa.wikis.domains.Xow_domain_tid_.Int__home) {
// data_raw = Bry_.Add(Temp__page_title, data_raw);
// }
byte[] data_raw = page.Db().Text().Text_bry();
main.Parse_text_to_wdom(root, ctx, tkn_mkr, data_raw , Xop_parser_.Doc_bgn_bos);
}
page.Root_(root);
root.Data_htm_(root.Root_src());
}
// private static final byte[] Temp__page_title = Bry_.new_a7("{{PageTitle}}");
}

View File

@@ -18,16 +18,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.amps; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.core.btries.*;
public class Xop_amp_mgr { // TS
private static final Btrie_rv trv = new Btrie_rv();
public Btrie_slim_mgr Amp_trie() {return amp_trie;} private final Btrie_slim_mgr amp_trie = Xop_amp_trie.Instance;
public Xop_amp_mgr_rslt Parse_tkn(Xop_tkn_mkr tkn_mkr, byte[] src, int src_len, int amp_pos, int bgn) {
int fail_pos = amp_pos + 1; // default to fail pos which is after &
// check amp_trie; EX: 'lt'
Xop_amp_mgr_rslt rv = new Xop_amp_mgr_rslt();
Btrie_rv match = amp_trie.Match_at(src, bgn, src_len);
Xop_amp_trie_itm itm = (Xop_amp_trie_itm)match.Obj();
int cur = match.Pos();
match.Pool__rls();
Xop_amp_trie_itm itm; int cur;
synchronized (trv) {
itm = (Xop_amp_trie_itm)amp_trie.Match_at(trv, src, bgn, src_len);
cur = trv.Pos();
}
if (itm == null) {
rv.Pass_n_(fail_pos);
return rv;
@@ -94,6 +97,7 @@ public class Xop_amp_mgr { // TS
int pos = 0;
Xop_amp_mgr_rslt amp_rv = null;
Bry_bfr bfr = null;
Btrie_rv trv = null;
// scan for &
while (pos < end) {
@@ -103,10 +107,10 @@ public class Xop_amp_mgr { // TS
if (nxt_pos < end) { // check & is not eos
byte nxt_b = src[nxt_pos];
Btrie_rv trie_rv = amp_trie.Match_at_w_b0(nxt_b, src, nxt_pos, end);
Object amp_obj = trie_rv.Obj();
int amp_pos = trie_rv.Pos();
trie_rv.Pool__rls();
if (trv == null) trv = new Btrie_rv();
Object amp_obj = amp_trie.Match_at_w_b0(trv, nxt_b, src, nxt_pos, end);
int amp_pos = trv.Pos();
if (amp_obj != null) {
if (!dirty) { // 1st amp found; add preceding String to bfr
if (bfr == null) {

View File

@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.parsers.apos; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
public class Xop_apos_wkr implements Xop_ctx_wkr {
private final List_adp stack = List_adp_.New();
private final List_adp stack = List_adp_.New(); // stores all apos tkns for page; needed to recalc tkn type if apos are dangling
private int bold_count, ital_count; private Xop_apos_tkn dual_tkn = null;
private Xop_apos_dat dat = new Xop_apos_dat();
public void Ctor_ctx(Xop_ctx ctx) {}

View File

@@ -18,8 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.core.log_msgs.*;
public class Xop_hdr_log {
private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "hdr");
public static final Gfo_msg_itm
private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "hdr");
public static final Gfo_msg_itm
Dangling_hdr = Gfo_msg_itm_.new_warn_(owner, "dangling_hdr")
, Mismatched = Gfo_msg_itm_.new_warn_(owner, "mismatched")
, Len_1 = Gfo_msg_itm_.new_warn_(owner, "len_1")

View File

@@ -18,6 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.core.strings.*;
public class HierPosAryBldr {
int[] ary; int aryIdx = -1; int root = -1;
public HierPosAryBldr(int ary_max) {ary = new int[ary_max]; this.Init();}
public void Init() {
int ary_max = ary.length;
for (int i = 0; i < ary_max; i++)
@@ -56,6 +58,4 @@ public class HierPosAryBldr {
sb.Add_spr_unless_first(Int_.To_str(ary[i]), " ", i);
return sb.To_str();
}
int[] ary; int aryIdx = -1; int root = -1;
public HierPosAryBldr(int ary_max) {ary = new int[ary_max]; this.Init();}
}

View File

@@ -17,12 +17,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
public class Xop_list_tkn_ {
public static final byte[]
Hook_ul = new byte[] {Byte_ascii.Nl, Byte_ascii.Star}, Hook_ol = new byte[] {Byte_ascii.Nl, Byte_ascii.Hash}
public static final byte[]
Hook_ul = new byte[] {Byte_ascii.Nl, Byte_ascii.Star} , Hook_ol = new byte[] {Byte_ascii.Nl, Byte_ascii.Hash}
, Hook_dt = new byte[] {Byte_ascii.Nl, Byte_ascii.Semic} , Hook_dd = new byte[] {Byte_ascii.Nl, Byte_ascii.Colon};
public static final byte List_itmTyp_null = 0, List_itmTyp_ul = Byte_ascii.Star, List_itmTyp_ol = Byte_ascii.Hash, List_itmTyp_dt = Byte_ascii.Semic, List_itmTyp_dd = Byte_ascii.Colon;
public static final String Str_li = "li", Str_ol = "ol", Str_ul = "ul", Str_dl = "dl", Str_dt = "dt", Str_dd = "dd";
public static final byte[] Byt_li = Bry_.new_a7(Str_li), Byt_ol = Bry_.new_a7(Str_ol), Byt_ul = Bry_.new_a7(Str_ul)
public static final String Str_li = "li", Str_ol = "ol", Str_ul = "ul", Str_dl = "dl", Str_dt = "dt", Str_dd = "dd";
public static final byte[] Byt_li = Bry_.new_a7(Str_li), Byt_ol = Bry_.new_a7(Str_ol), Byt_ul = Bry_.new_a7(Str_ul)
, Byt_dl = Bry_.new_a7(Str_dl), Byt_dt = Bry_.new_a7(Str_dt), Byt_dd = Bry_.new_a7(Str_dd);
public static byte[] XmlTag_lst(byte b) {
switch (b) {

View File

@@ -173,7 +173,7 @@ public class Xop_lnke_wkr implements Xop_ctx_wkr {
byte[] xwiki_wiki = xo_url_parser_url.Wiki_bry();
byte[] xwiki_page = xo_url_parser_url.Page_bry();
byte[] ttl_bry = xo_url_parser_url.Page_bry();
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry);
if (ttl != null && ttl.Wik_itm() != null) {
xwiki_wiki = ttl.Wik_itm().Domain_bry();
xwiki_page = ttl.Page_url();

View File

@@ -182,5 +182,5 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
ctx.App().Usr_dlg().Warn_many("", "", "fatal error in lnki: page=~{0} src=~{1} err=~{2}", String_.new_u8(ctx.Page().Ttl().Full_db()), String_.new_u8(src, lnki.Src_bgn(), lnki.Src_end()), Err_.Message_gplx_full(e));
return false;
}
} private static final byte[] Const_pipe = Bry_.new_a7("|");
} private static final byte[] Const_pipe = Bry_.new_a7("|");
}

View File

@@ -56,10 +56,10 @@ public class Xop_lnki_wkr_ {
tmp_bfr.Mkr_rls();
}
Xowe_wiki wiki = ctx.Wiki();
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry);
if (ttl == null) return false;
if ( wiki.Cfg_parser_lnki_xwiki_repos_enabled() // wiki has lnki.xwiki_repos
&& ttl.Wik_bgn() != Xoa_ttl.Null_wik_bgn // xwiki available; EX: [[en:]]
&& ttl.Wik_bgn() != Null_wik_bgn // xwiki available; EX: [[en:]]
)
ttl = Adj_ttl_for_file(wiki, ctx, ttl, ttl_bry);
lnki.Ttl_(ttl);
@@ -73,7 +73,7 @@ public class Xop_lnki_wkr_ {
if (xwiki_bry_len + 1 >= ttl_bry_len) return ttl; // invalid ttl; EX: [[en:]]
byte[] ttl_in_xwiki_bry = Bry_.Mid(ttl_bry, xwiki_bry_len + 1, ttl_bry_len); // +1 to position after xwiki :; EX: [[en:File:A.png]]; +1 to put after ":" at "F"
if (!wiki.Cfg_parser().Lnki_cfg().Xwiki_repo_mgr().Has(xwiki_bry)) return ttl; // alias not in xwikis; EX: [[en_bad:File:A.png]]
Xoa_ttl ttl_in_xwiki = Xoa_ttl.parse(wiki, ttl_in_xwiki_bry);
Xoa_ttl ttl_in_xwiki = Xoa_ttl.Parse(wiki, ttl_in_xwiki_bry);
if (ttl_in_xwiki == null) return ttl; // occurs if ttl is bad in xwiki; EX: [[en:<bad>]]
return ttl_in_xwiki.Ns().Id_is_file() ? ttl_in_xwiki : ttl;
}
@@ -144,4 +144,5 @@ public class Xop_lnki_wkr_ {
bfr.Add(ttl.Full_db());
bfr.Add(Xop_tkn_.Lnki_end);
}
private static final int Null_wik_bgn = -1;
}

View File

@@ -143,9 +143,9 @@ public class Xop_lnki_wkr__basic_tst {
fxt.Test_parse_page_wiki("[[a|]]", fxt.tkn_lnki_().Trg_tkn_(fxt.tkn_arg_val_txt_(2, 3)));
}
@Test public void Exc_empty() {
fxt.Init_log_(Xop_ttl_log.Len_0, Xop_lnki_log.Invalid_ttl);
fxt.Init_log_(Xop_lnki_log.Invalid_ttl);
fxt.Test_parse_page_wiki("[[]]", fxt.tkn_txt_(0, 2), fxt.tkn_txt_(2, 4));
fxt.Init_log_(Xop_ttl_log.Len_0, Xop_lnki_log.Invalid_ttl);
fxt.Init_log_(Xop_lnki_log.Invalid_ttl);
fxt.Test_parse_page_wiki("[[ ]]", fxt.tkn_txt_(0, 2), fxt.tkn_space_(2, 3), fxt.tkn_txt_(3, 5));
}
@Test public void Exc_invalid_u8() { // PURPOSE: "%DO" is an invalid UTF-8 sequence (requires 2 bytes, not just %D0); DATE:2013-11-11
@@ -306,10 +306,10 @@ public class Xop_lnki_wkr__basic_tst {
}
@Test public void Visited() { // PURPOSE: show redirected titles as visited; EX:fr.w:Alpes_Pennines; DATE:2014-02-28
Xowe_wiki wiki = fxt.Wiki();
Xoa_ttl ttl = Xoa_ttl.parse(wiki, Bry_.new_a7("Src")); // simulate requrest for "Src" page
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, Bry_.new_a7("Src")); // simulate requrest for "Src" page
Xoae_page previous_page = Xoae_page.New_test(wiki, ttl);
previous_page.Redirected_ttls().Add(Bry_.new_a7("Src")); // simulate redirect from "Src"
fxt.App().Usere().History_mgr().Add(previous_page); // simulate "Src" already being clicked once; this is the key call
previous_page.Redirect().Itms__add__article(previous_page.Url(), ttl, null); // simulate redirect from "Src"
fxt.App().Usere().History_mgr().Add(previous_page); // simulate "Src" already being clicked once; this is the key call
fxt.Wtr_cfg().Lnki_visited_y_();
fxt.Test_parse_page_all_str("[[Src]]" , "<a href=\"/wiki/Src\" class=\"xowa-visited\">Src</a>"); // show [[Src]] as visited since it exists in history
fxt.Test_parse_page_all_str("[[Other]]" , "<a href=\"/wiki/Other\">Other</a>"); // show other pages as not visited

View File

@@ -30,7 +30,7 @@ public class Xop_lnki_wkr__invalid_tst {
fxt.Test_parse_page_all_str("[[''[a]'']]" , "[[<i>[a]</i>]]");
}
@Test public void Pipe_only() {
fxt.Init_log_(Xop_ttl_log.Len_0, Xop_lnki_log.Invalid_ttl);
fxt.Init_log_(Xop_lnki_log.Invalid_ttl);
fxt.Test_parse_page_wiki("[[|]]", fxt.tkn_txt_(0, 2), fxt.tkn_pipe_(2), fxt.tkn_txt_(3, 5));
}
@Test public void Xnde_should_force_ttl_parse() { // PURPOSE: reparse should be forced at xnde not at pipe; EX: [[a<b>c</b>|d]] reparse should start at <b>; DATE:2014-03-30

View File

@@ -38,7 +38,7 @@ public class Xop_log_basic_wkr implements Gfo_invk {
( log_tid
, log_msg == Xop_log_basic_wkr.Null_log_msg ? "" : String_.new_u8(log_msg)
, save_log_time ? Env_.TickCount_elapsed_in_frac(log_bgn) : Xop_log_basic_wkr.Null_log_time
, page.Revision_data().Id()
, page.Db().Page().Id()
, save_page_ttl ? String_.new_u8(page.Ttl().Full_db()) : Xop_log_basic_wkr.Null_page_ttl
, save_args_len ? args_len : Xop_log_basic_wkr.Null_args_len
, save_args_str ? String_.new_u8(src, args_bgn, args_end) : Xop_log_basic_wkr.Null_args_str

View File

@@ -20,60 +20,63 @@ import gplx.core.btries.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*;
import gplx.xowa.htmls.tocs.*;
public class Xop_under_lxr implements Xop_lxr {
private final Object thread_lock = new Object();
private Btrie_mgr words_trie_ci, words_trie_cs;
public int Lxr_tid() {return Xop_lxr_.Tid_under;}
public void Init_by_wiki(Xowe_wiki wiki, Btrie_fast_mgr core_trie) {}
public void Init_by_lang(Xol_lang_itm lang, Btrie_fast_mgr core_trie) {
Xol_kwd_mgr kwd_mgr = lang.Kwd_mgr();
int under_kwds_len = under_kwds.length;
Xop_under_lxr lxr = new Xop_under_lxr();
lxr.words_trie_cs = Btrie_slim_mgr.cs();
lxr.words_trie_ci = Btrie_u8_mgr.new_(lang.Case_mgr());
core_trie.Add(Xop_under_hook.Key_std, lxr);
boolean hook_alt_null = true;
for (int i = 0; i < under_kwds_len; i++) {
int kwd_id = under_kwds[i];
Xol_kwd_grp kwd_grp = kwd_mgr.Get_or_new(kwd_id);
Xol_kwd_itm[] kwd_itms = kwd_grp.Itms(); if (kwd_itms == null) continue;
int kwd_itms_len = kwd_itms.length;
boolean kwd_case_match = kwd_grp.Case_match();
Btrie_mgr words_trie = kwd_grp.Case_match() ? lxr.words_trie_cs : lxr.words_trie_ci;
for (int j = 0; j < kwd_itms_len; j++) {
Xol_kwd_itm kwd_itm = kwd_itms[j];
byte[] kwd_bry = kwd_itm.Val();
int kwd_len = kwd_bry.length;
Object hook_obj = Hook_trie.Match_bgn(kwd_bry, 0, kwd_len);
if (hook_obj != null) {
Xop_under_hook hook = (Xop_under_hook)hook_obj;
byte[] word_bry = Bry_.Mid(kwd_bry, hook.Key_len(), kwd_bry.length);
words_trie.Add_obj(word_bry, new Xop_under_word(kwd_id, word_bry));
if (hook_alt_null && hook.Tid() == Xop_under_hook.Tid_alt) {
core_trie.Add(Xop_under_hook.Key_alt, lxr);
hook_alt_null = false;
synchronized (thread_lock) { // TS; DATE:2016-07-06
Xol_kwd_mgr kwd_mgr = lang.Kwd_mgr();
int under_kwds_len = under_kwds.length;
Xop_under_lxr lxr = new Xop_under_lxr();
lxr.words_trie_cs = Btrie_slim_mgr.cs();
lxr.words_trie_ci = Btrie_u8_mgr.new_(lang.Case_mgr());
core_trie.Add(Xop_under_hook.Key_std, lxr);
boolean hook_alt_null = true;
for (int i = 0; i < under_kwds_len; i++) {
int kwd_id = under_kwds[i];
Xol_kwd_grp kwd_grp = kwd_mgr.Get_or_new(kwd_id);
Xol_kwd_itm[] kwd_itms = kwd_grp.Itms(); if (kwd_itms == null) continue;
int kwd_itms_len = kwd_itms.length;
boolean kwd_case_match = kwd_grp.Case_match();
Btrie_mgr words_trie = kwd_grp.Case_match() ? lxr.words_trie_cs : lxr.words_trie_ci;
for (int j = 0; j < kwd_itms_len; j++) {
Xol_kwd_itm kwd_itm = kwd_itms[j];
byte[] kwd_bry = kwd_itm.Val();
int kwd_len = kwd_bry.length;
Object hook_obj = Hook_trie.Match_bgn(kwd_bry, 0, kwd_len);
if (hook_obj != null) {
Xop_under_hook hook = (Xop_under_hook)hook_obj;
byte[] word_bry = Bry_.Mid(kwd_bry, hook.Key_len(), kwd_bry.length);
words_trie.Add_obj(word_bry, new Xop_under_word(kwd_id, word_bry));
if (hook_alt_null && hook.Tid() == Xop_under_hook.Tid_alt) {
core_trie.Add(Xop_under_hook.Key_alt, lxr);
hook_alt_null = false;
}
}
}
else { // kwd doesn't start with __; no known examples, but just in case; EX: "NOTOC"; DATE:2014-02-14
Xop_word_lxr word_lxr = new Xop_word_lxr(kwd_id);
if (kwd_case_match) // cs; add word directly to trie
core_trie.Add(kwd_bry, word_lxr);
else { // NOTE: next part is imprecise; XOWA parser is cs, but kwd is ci; for now, just add all upper and all lower
Gfo_usr_dlg_.Instance.Warn_many("", "", "under keyword does not start with __; id=~{0} key=~{1} word=~{2}", kwd_id, String_.new_u8(kwd_grp.Key()), String_.new_u8(kwd_bry));
core_trie.Add(lang.Case_mgr().Case_build_lower(kwd_bry), word_lxr);
core_trie.Add(lang.Case_mgr().Case_build_upper(kwd_bry), word_lxr);
else { // kwd doesn't start with __; no known examples, but just in case; EX: "NOTOC"; DATE:2014-02-14
Xop_word_lxr word_lxr = new Xop_word_lxr(kwd_id);
if (kwd_case_match) // cs; add word directly to trie
core_trie.Add(kwd_bry, word_lxr);
else { // NOTE: next part is imprecise; XOWA parser is cs, but kwd is ci; for now, just add all upper and all lower
Gfo_usr_dlg_.Instance.Warn_many("", "", "under keyword does not start with __; id=~{0} key=~{1} word=~{2}", kwd_id, String_.new_u8(kwd_grp.Key()), String_.new_u8(kwd_bry));
core_trie.Add(lang.Case_mgr().Case_build_lower(kwd_bry), word_lxr);
core_trie.Add(lang.Case_mgr().Case_build_upper(kwd_bry), word_lxr);
}
}
}
}
}
}
public void Term(Btrie_fast_mgr core_trie) {}
private static final int[] under_kwds = new int[] // REF.MW:MagicWord.php
private static final int[] under_kwds = new int[] // REF.MW:MagicWord.php
{ Xol_kwd_grp_.Id_toc, Xol_kwd_grp_.Id_notoc, Xol_kwd_grp_.Id_forcetoc
, Xol_kwd_grp_.Id_nogallery, Xol_kwd_grp_.Id_noheader, Xol_kwd_grp_.Id_noeditsection
, Xol_kwd_grp_.Id_notitleconvert, Xol_kwd_grp_.Id_nocontentconvert, Xol_kwd_grp_.Id_newsectionlink, Xol_kwd_grp_.Id_nonewsectionlink
, Xol_kwd_grp_.Id_hiddencat, Xol_kwd_grp_.Id_index, Xol_kwd_grp_.Id_noindex, Xol_kwd_grp_.Id_staticredirect
, Xol_kwd_grp_.Id_disambig
};
private static final Btrie_fast_mgr Hook_trie = Btrie_fast_mgr.cs()
private static final Btrie_fast_mgr Hook_trie = Btrie_fast_mgr.cs()
.Add(Xop_under_hook.Key_std, Xop_under_hook.Itm_std)
.Add(Xop_under_hook.Key_alt, Xop_under_hook.Itm_alt)
;
@@ -111,7 +114,7 @@ public class Xop_under_lxr implements Xop_lxr {
default: break; // ignore anything else
}
}
public static final Xop_under_lxr Instance = new Xop_under_lxr(); Xop_under_lxr() {}
public static final Xop_under_lxr Instance = new Xop_under_lxr(); Xop_under_lxr() {}
}
class Xop_word_lxr implements Xop_lxr {
private int kwd_id;
@@ -131,8 +134,8 @@ class Xop_under_hook {
public byte[] Key() {return key;} private byte[] key;
public int Key_len() {return key_len;} private int key_len;
public static final byte Tid_std = 1, Tid_alt = 2;
public static final byte[] Key_std = new byte[] {Byte_ascii.Underline, Byte_ascii.Underline}, Key_alt = Bry_.new_u8("__"); // ja wikis
public static final Xop_under_hook
public static final byte[] Key_std = new byte[] {Byte_ascii.Underline, Byte_ascii.Underline}, Key_alt = Bry_.new_u8("__"); // ja wikis
public static final Xop_under_hook
Itm_std = new Xop_under_hook(Tid_std, Key_std)
, Itm_alt = new Xop_under_hook(Tid_alt, Key_alt)
;

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.miscs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import org.junit.*; import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*;
public class Xop_under_lxr_tst {
private final Xop_fxt fxt = new Xop_fxt();
private final Xop_fxt fxt = new Xop_fxt();
@Before public void init() {fxt.Reset();}
@After public void term() {fxt.Init_para_n_();}
@Test public void Toc_basic() {
@@ -98,7 +98,7 @@ public class Xop_under_lxr_tst {
fxt.Test_parse_page_all_str("__DISAMBIG__", "");
}
@Test public void Nocontentconvert() { // simple test; test for flag only; DATE:2014-02-06
gplx.xowa.wikis.pages.Xopg_html_data html_data = fxt.Page().Html_data();
gplx.xowa.wikis.pages.htmls.Xopg_html_data html_data = fxt.Page().Html_data();
Tfds.Eq(html_data.Lang_convert_content(), true);
Tfds.Eq(html_data.Lang_convert_title(), true);
fxt.Test_parse_page_all_str("__NOCONTENTCONVERT__ __NOTITLECONVERT__", " ");

View File

@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.parsers.tmpls; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.miscs.*;
public class Arg_bldr {
public class Arg_bldr { // TS
public boolean Bld(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_arg_wkr wkr, int wkr_typ, Xop_root_tkn root, Xop_tkn_itm tkn, int bgn_pos, int cur_pos, int loop_bgn, int loop_end, byte[] src) {
boolean ws_bgn_chk = true, colon_chk = false, itm_is_static = true, key_exists = false; int ws_bgn_idx = -1, ws_end_idx = -1, cur_itm_subs_len = 0, cur_nde_idx = -1; Arg_nde_tkn cur_nde = null; Arg_itm_tkn cur_itm = null;
int brack_count = 0;
@@ -190,7 +190,7 @@ public class Arg_bldr {
// itm.Dat_ary_(dat_end == dat_bgn ? Bry_.Empty : Bry_.Mid(src, dat_bgn, dat_end));
itm.Itm_static_(itm_is_static);
}
public static final Arg_bldr Instance = new Arg_bldr(); Arg_bldr() {}
public static final Arg_bldr Instance = new Arg_bldr(); Arg_bldr() {}
}
/*
NOTE_1:mark tkn ignore unless wkr is prm;

View File

@@ -56,13 +56,11 @@ public class Xop_subst_tst {
@Test public void Urlencode_invalid_ttl() { // PURPOSE: handle invalid ttl inside does-template-exist; EX: en.d:peace; DATE:2014-03-31
fxt.Init_defn_clear();
fxt.Init_defn_add("test", "{{safesubst:urlencode:{{safesubst:Template:{{{1}}}}}}}");
fxt.Init_log_(Xop_ttl_log.Invalid_char);
fxt.Test_parse_page_tmpl_str("{{test|[xyz]}}", "%7B%7Bsafesubst%3ATemplate%3A%5Bxyz%5D%7D%7D"); // url-encoded version of {{safesubst:Template:xyz}}
}
@Test public void Urlencode_template_ttl() { // PURPOSE: handle template ttl inside does-template-exist; based on above; DATE:2014-03-31
fxt.Init_defn_clear();
fxt.Init_defn_add("test", "{{safesubst:urlencode:{{Template:{{{1}}}}}}}");
fxt.Init_log_(Xop_ttl_log.Invalid_char);
fxt.Test_parse_page_tmpl_str("{{test|Template:[xyz]}}", "%7B%7BTemplate%3ATemplate%3A%5Bxyz%5D%7D%7D"); // url-encoded version of {{safesubst:Template:xyz}}
}
@Test public void Nowiki() { // PURPOSE: stack overflow; PAGE:Близкиерузья_(Сезон_2) DATE:2014-10-21

View File

@@ -54,7 +54,7 @@ public class Xot_defn_tmpl implements Xot_defn {
}
return bfr.To_bry_and_rls();
}
private static final byte[] Bry_onlyinclude_bgn = Bry_.new_a7("<onlyinclude>"), Bry_onlyinclude_end = Bry_.new_a7("</onlyinclude>");
private static final byte[] Bry_onlyinclude_bgn = Bry_.new_a7("<onlyinclude>"), Bry_onlyinclude_end = Bry_.new_a7("</onlyinclude>");
private static int Bry_onlyinclude_bgn_len = Bry_onlyinclude_bgn.length, Bry_onlyinclude_end_len = Bry_onlyinclude_end.length;
public void Rls() {
if (root != null) root.Clear();
@@ -62,33 +62,35 @@ public class Xot_defn_tmpl implements Xot_defn {
}
public void Parse_tmpl(Xop_ctx ctx) {ctx.Wiki().Parser_mgr().Main().Parse_text_to_defn(this, ctx, ctx.Tkn_mkr(), ns, name, data_raw);} boolean onlyinclude_parsed = false;
public boolean Tmpl_evaluate(Xop_ctx ctx, Xot_invk caller, Bry_bfr bfr) {
if (root == null) Parse_tmpl(ctx);
Xoae_page page = ctx.Page();
if (!page.Tmpl_stack_add(full_name)) {
bfr.Add_str_a7("<!-- template loop detected:" + gplx.langs.htmls.Gfh_utl.Escape_html_as_str(String_.new_u8(name)) + " -->");
Xoa_app_.Usr_dlg().Log_many("", "", "template loop detected: url=~{0} name=~{1}", ctx.Page().Url().To_str(), name);
return false;
}
boolean rv = true;
if (onlyInclude_exists) {
Xowe_wiki wiki = ctx.Wiki();
if (!onlyinclude_parsed) {
onlyinclude_parsed = true;
byte[] new_data = Extract_onlyinclude(data_raw, wiki.Utl__bfr_mkr());
Xop_ctx new_ctx = Xop_ctx.new_sub_(wiki);
Xot_defn_tmpl tmpl = wiki.Parser_mgr().Main().Parse_text_to_defn_obj(new_ctx, new_ctx.Tkn_mkr(), wiki.Ns_mgr().Ns_template(), Bry_.Empty, new_data);
tmpl.Root().Tmpl_compile(new_ctx, new_data, Xot_compile_data.Null);
data_raw = new_data;
root = tmpl.Root();
// synchronized (this) { // LOCK:DELETE; DATE:2016-07-06
if (root == null) Parse_tmpl(ctx);
Xoae_page page = ctx.Page();
if (!page.Tmpl_stack_add(full_name)) {
bfr.Add_str_a7("<!-- template loop detected:" + gplx.langs.htmls.Gfh_utl.Escape_html_as_str(String_.new_u8(name)) + " -->");
Xoa_app_.Usr_dlg().Log_many("", "", "template loop detected: url=~{0} name=~{1}", ctx.Page().Url().To_str(), name);
return false;
}
}
int subs_len = root.Subs_len();
for (int i = 0; i < subs_len; i++) {
boolean result = root.Subs_get(i).Tmpl_evaluate(ctx, data_raw, caller, bfr);
if (!result) rv = false;
}
page.Tmpl_stack_del();
return rv;
boolean rv = true;
if (onlyInclude_exists) {
Xowe_wiki wiki = ctx.Wiki();
if (!onlyinclude_parsed) {
onlyinclude_parsed = true;
byte[] new_data = Extract_onlyinclude(data_raw, wiki.Utl__bfr_mkr());
Xop_ctx new_ctx = Xop_ctx.new_sub_(wiki, ctx);
Xot_defn_tmpl tmpl = wiki.Parser_mgr().Main().Parse_text_to_defn_obj(new_ctx, new_ctx.Tkn_mkr(), wiki.Ns_mgr().Ns_template(), Bry_.Empty, new_data);
tmpl.Root().Tmpl_compile(new_ctx, new_data, Xot_compile_data.Null);
data_raw = new_data;
root = tmpl.Root();
}
}
int subs_len = root.Subs_len();
for (int i = 0; i < subs_len; i++) {
boolean result = root.Subs_get(i).Tmpl_evaluate(ctx, data_raw, caller, bfr);
if (!result) rv = false;
}
page.Tmpl_stack_del();
return rv;
// }
}
public Xot_defn Clone(int id, byte[] name) {throw Err_.new_unimplemented();}
boolean onlyInclude_exists;

View File

@@ -38,7 +38,7 @@ class Xot_defn_trace_fxt {
Xop_ctx ctx = fxt.Ctx();
ctx.Defn_trace().Clear();
byte[] src = Bry_.new_u8(raw);
ctx.Page().Ttl_(Xoa_ttl.parse(fxt.Wiki(), Bry_.new_a7("test")));
ctx.Page().Ttl_(Xoa_ttl.Parse(fxt.Wiki(), Bry_.new_a7("test")));
Xop_root_tkn root = ctx.Tkn_mkr().Root(src);
fxt.Parser().Parse_page_all_clear(root, ctx, ctx.Tkn_mkr(), src);
ctx.Defn_trace().Print(src, tmp);

View File

@@ -48,6 +48,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
val.Subs_get(j).Tmpl_compile(ctx, src, prep_data);
}
}
private static final Xol_func_itm finder = new Xol_func_itm();
@Override public boolean Tmpl_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Bry_bfr bfr) { // this="{{t|{{{0}}}}}" caller="{{t|1}}"
boolean rv = false;
Xot_defn defn = tmpl_defn; Xowe_wiki wiki = ctx.Wiki(); Xol_lang_itm lang = wiki.Lang();
@@ -100,10 +101,17 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
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);
Xol_func_itm finder = lang.Func_regy().Find_defn(name_ary, name_bgn, name_ary_len);
defn = finder.Func();
int finder_tid, finder_colon_pos, finder_subst_end;
synchronized (finder) {
lang.Func_regy().Find_defn(finder, name_ary, name_bgn, name_ary_len);
defn = finder.Func();
finder_tid = finder.Tid();
finder_colon_pos = finder.Colon_pos();
finder_subst_end = finder.Subst_end();
}
int colon_pos = -1;
switch (finder.Tid()) {
switch (finder_tid) {
case Xot_defn_.Tid_subst: // subst is added verbatim; EX: {{subst:!}} -> {{subst:!}}; logic below is to handle printing of arg which could be standardized if src[] was available for tmpl
bfr.Add(Xop_curly_bgn_lxr.Hook).Add(name_ary);
for (int i = 0; i < args_len; i++) {
@@ -115,10 +123,10 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
bfr.Add(Xop_curly_end_lxr.Hook);
return true; // NOTE: nothing else to do; return
case Xot_defn_.Tid_safesubst:
name_ary = Bry_.Mid(name_ary, finder.Subst_end(), name_ary_len); // chop off "safesubst:"
name_ary = Bry_.Mid(name_ary, finder_subst_end, name_ary_len); // chop off "safesubst:"
name_ary_len = name_ary.length;
if (defn != Xot_defn_.Null) { // func found
if (finder.Colon_pos() != -1) colon_pos = finder.Func().Name().length; // set colon_pos; SEE NOTE_1
if (finder_colon_pos != -1) colon_pos = defn.Name().length; // set colon_pos; SEE NOTE_1
}
subst_found = true;
break;
@@ -129,7 +137,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
defn = Xot_defn_.Null;
}
else {
colon_pos = finder.Colon_pos();
colon_pos = finder_colon_pos;
}
break;
case Xot_defn_.Tid_raw:
@@ -137,7 +145,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
int raw_colon_pos = Bry_find_.Find_fwd(name_ary, Byte_ascii.Colon);
if (raw_colon_pos == Bry_find_.Not_found) {} // colon missing; EX: {{raw}}; noop and assume template name; DATE:2014-02-11
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 = 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
if (ns_eval2 != null) {
@@ -147,7 +155,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
return SubEval(ctx, wiki, bfr, name_ary, caller, src);
}
}
switch (finder.Tid()) {
switch (finder_tid) {
case Xot_defn_.Tid_msg:
defn = Xot_defn_.Null; // null out defn to force template load below; DATE:2014-07-10
break;
@@ -174,7 +182,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
defn = wiki.Cache_mgr().Defn_cache().Get_by_key(name_ary);
if (defn == null) {
if (name_ary_len != 0 ) { // name_ary_len != 0 for direct template inclusions; PAGE:en.w:Human evolution and {{:Human evolution/Species chart}}; && ctx.Tmpl_whitelist().Has(name_ary)
Xoa_ttl ttl = Xoa_ttl.parse(wiki, Bry_.Add(wiki.Ns_mgr().Ns_template().Name_db_w_colon(), name_ary));
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, Bry_.Add(wiki.Ns_mgr().Ns_template().Name_db_w_colon(), name_ary));
if (ttl == null) { // ttl is not valid; just output orig; REF.MW:Parser.php|braceSubstitution|if ( !$found ) $text = $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args );
if (subst_found || template_prefix_found) { // if "subst:" or "Template:" found, use orig name; DATE:2014-03-31
bfr.Add(Xop_curly_bgn_lxr.Hook).Add(name_ary_orig).Add(Xop_curly_end_lxr.Hook);
@@ -207,7 +215,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
Xowd_page_itm page = lang.Vnt_mgr().Convert_mgr().Convert_ttl(wiki, wiki.Ns_mgr().Ns_template(), name_ary);
if (page != Xowd_page_itm.Null) {
name_ary = page.Ttl_page_db();
Xoa_ttl ttl = Xoa_ttl.parse(wiki, Bry_.Add(wiki.Ns_mgr().Ns_template().Name_db_w_colon(), name_ary));
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, Bry_.Add(wiki.Ns_mgr().Ns_template().Name_db_w_colon(), name_ary));
if (ttl == null) { // ttl is not valid; just output orig; REF.MW:Parser.php|braceSubstitution|if ( !$found ) $text = $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args );
bfr.Add(Xop_curly_bgn_lxr.Hook).Add(name_ary).Add(Xop_curly_end_lxr.Hook);
return false;
@@ -344,7 +352,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
}
}
private boolean Transclude(Xop_ctx ctx, Xowe_wiki wiki, Bry_bfr bfr, boolean template_prefix_found, byte[] name_ary, Xot_invk caller, byte[] src) {
Xoa_ttl page_ttl = Xoa_ttl.parse(wiki, name_ary); if (page_ttl == null) return false; // ttl not valid; EX: {{:[[abc]]}}
Xoa_ttl page_ttl = Xoa_ttl.Parse(wiki, name_ary); if (page_ttl == null) return false; // ttl not valid; EX: {{:[[abc]]}}
byte[] transclude_src = null;
if (page_ttl.Ns().Id_is_tmpl()) { // ttl is template; check tmpl_regy first before going to data_mgr
Xot_defn_tmpl tmpl = (Xot_defn_tmpl)wiki.Cache_mgr().Defn_cache().Get_by_key(page_ttl.Page_db());
@@ -407,7 +415,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
bfr.Add(name_ary).Add(Xop_tkn_.Lnki_end);
}
private boolean SubEval(Xop_ctx ctx, Xowe_wiki wiki, Bry_bfr bfr, byte[] name_ary, Xot_invk caller, byte[] src_for_tkn) {
Xoa_ttl page_ttl = Xoa_ttl.parse(wiki, name_ary); if (page_ttl == null) return false; // ttl not valid; EX: {{:[[abc]]}}
Xoa_ttl page_ttl = Xoa_ttl.Parse(wiki, name_ary); if (page_ttl == null) return false; // ttl not valid; EX: {{:[[abc]]}}
Xot_defn_tmpl transclude_tmpl = null;
switch (page_ttl.Ns().Id()) {
case Xow_ns_.Tid__template: // ttl is template not in cache, or some other ns; do load

View File

@@ -52,6 +52,7 @@ public class Xot_invk_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
invk.Args_add(ctx, nde);
return true;
}
private static final Xol_func_itm finder = new Xol_func_itm();
private static void AddNameArg(Xop_ctx ctx, byte[] src, Xot_invk_tkn invk, Arg_nde_tkn nde) {
// make valTkn into a keyTkn; note that argBldr will only generate a valTkn
Arg_itm_tkn key_tkn = nde.Val_tkn(), val_tkn = nde.Key_tkn();
@@ -60,18 +61,26 @@ public class Xot_invk_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
if (key_tkn.Itm_static() != Bool_.Y_byte) return; // dynamic tkn; can't identify func/name
int colon_pos = -1, txt_bgn = key_tkn.Dat_bgn(), txt_end = key_tkn.Dat_end();
Xol_func_itm finder = ctx.Wiki().Lang().Func_regy().Find_defn(src, txt_bgn, txt_end);
Xot_defn finder_func = finder.Func();
byte finder_typeId = finder.Tid();
switch (finder_typeId) {
Xot_defn finder_func; byte finder_tid; int finder_colon_pos, finder_subst_bgn, finder_subst_end;;
synchronized (finder) {
ctx.Wiki().Lang().Func_regy().Find_defn(finder, src, txt_bgn, txt_end);
finder_func = finder.Func();
finder_tid = finder.Tid();
finder_colon_pos = finder.Colon_pos();
finder_subst_bgn = finder.Subst_bgn();
finder_subst_end = finder.Subst_end();
}
switch (finder_tid) {
case Xot_defn_.Tid_func: // func
colon_pos = finder.Colon_pos();
colon_pos = finder_colon_pos;
break;
case Xot_defn_.Tid_subst: // subst/safesubst; mark invk_tkn
case Xot_defn_.Tid_safesubst:
int subst_bgn = finder.Subst_bgn(), subst_end = finder.Subst_end();
invk.Tmpl_subst_props_(finder_typeId, subst_bgn, subst_end);
if ((ctx.Parse_tid() == Xop_parser_.Parse_tid_tmpl && finder_typeId == Xot_defn_.Tid_subst) // NOTE: if subst, but in tmpl stage, do not actually subst; PAGE:en.w:Unreferenced; DATE:2013-01-31
int subst_bgn = finder_subst_bgn, subst_end = finder_subst_end;
invk.Tmpl_subst_props_(finder_tid, subst_bgn, subst_end);
if ((ctx.Parse_tid() == Xop_parser_.Parse_tid_tmpl && finder_tid == Xot_defn_.Tid_subst) // NOTE: if subst, but in tmpl stage, do not actually subst; PAGE:en.w:Unreferenced; DATE:2013-01-31
|| ctx.Page().Ttl().Ns().Id_is_tmpl()) { // also, if on tmpl page, never evaluate (questionable, but seems to be needed)
}
else {
@@ -79,7 +88,7 @@ public class Xot_invk_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
key_tkn.Dat_ary_had_subst_y_();
}
if (finder_func != Xot_defn_.Null) {
colon_pos = finder.Colon_pos();
colon_pos = finder_colon_pos;
txt_bgn = subst_end;
}
break;

View File

@@ -167,7 +167,7 @@ public class Xot_invk_wkr__basic__tst {
fxt.Test_parse_tmpl_str_test("{{{1}}}{{{2}}}" , "{{test|[[b=c|d}}" , "{{test|[[b=c|d}}");
}
@Test public void Err_tmp_empty() { // PURPOSE: {{{{R from misspelling}} }}
fxt.Init_log_(Xop_ttl_log.Invalid_char).Test_parse_tmpl_str_test("{{{1}}}" , "{{ {{a}} }}" , "{{[[:Template:a]]}}");
fxt.Test_parse_tmpl_str_test("{{{1}}}" , "{{ {{a}} }}" , "{{[[:Template:a]]}}");
}
@Test public void Mismatch_bgn() { // PURPOSE: handle {{{ }}; WP:Paris Commune; Infobox Former Country
fxt.Init_defn_clear();

View File

@@ -22,13 +22,13 @@ public class Xot_invk_wkr__missing__tst {
@Test public void Missing() {
fxt.Init_defn_clear();
fxt.Init_defn_add("test_template", "{{[[Template:{{{1}}}|{{{1}}}]]}}");
fxt.Init_log_(Xop_ttl_log.Invalid_char).Test_parse_tmpl_str("{{test_template|a}}", "{{[[Template:a|a]]}}");
fxt.Test_parse_tmpl_str("{{test_template|a}}", "{{[[Template:a|a]]}}");
fxt.Init_defn_clear();
}
@Test public void Missing__name_and_args() { // PURPOSE: missing title should return name + args; used to only return name; PAGE:en.w:Flag_of_Greenland; DATE:2016-06-21
fxt.Init_defn_clear();
fxt.Init_defn_add("test_template", "{{ {{{1}}} | a | b }}");
fxt.Init_log_(Xop_ttl_log.Invalid_char).Test_parse_tmpl_str("{{test_template}}", "{{{{{1}}}| a | b }}"); // NOTE: this should include spaces (" {{{1}}} "), but for now, ignore
fxt.Test_parse_tmpl_str("{{test_template}}", "{{{{{1}}}| a | b }}"); // NOTE: this should include spaces (" {{{1}}} "), but for now, ignore
fxt.Init_defn_clear();
}
@Test public void Missing_foreign() {

View File

@@ -42,5 +42,5 @@ class Xot_prm_wkr implements Xop_arg_wkr {
}
return true;
}
public static final Xot_prm_wkr Instance = new Xot_prm_wkr(); Xot_prm_wkr() {}
public static final Xot_prm_wkr Instance = new Xot_prm_wkr(); Xot_prm_wkr() {}
}

View File

@@ -18,8 +18,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.parsers.tmpls.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.langs.kwds.*;
import gplx.xowa.wikis.pages.redirects.*;
public class Xop_redirect_mgr {
private final Xowe_wiki wiki; private final Gfo_url_encoder url_decoder; private Hash_adp_bry redirect_hash;
private final Xowe_wiki wiki; private final Gfo_url_encoder url_decoder; private Hash_adp_bry redirect_hash;
public Xop_redirect_mgr(Xowe_wiki wiki) {this.wiki = wiki; this.url_decoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url_ttl;} // NOTE: must be Url_ttl, not Url; PAGE:en.w:Template:Positionskarte+ -> Template:Location_map+, not Template:Location_map DATE:2014-08-21
public void Clear() {redirect_hash = null;} // TEST:
public boolean Is_redirect(byte[] text, int text_len) {return this.Extract_redirect(text, text_len) != null;}
@@ -54,13 +55,13 @@ public class Xop_redirect_mgr {
ttl_end = pipe_pos; // end ttl at pipe
byte[] redirect_bry = Bry_.Mid(src, ttl_bgn, ttl_end);
redirect_bry = url_decoder.Decode(redirect_bry); // NOTE: url-decode links; PAGE: en.w:Watcher_(Buffy_the_Vampire_Slayer); DATE:2014-08-18
return Xoa_ttl.parse(wiki, redirect_bry);
return Xoa_ttl.Parse(wiki, redirect_bry);
}
public static final Xoa_ttl Extract_redirect_is_null = null;
public static final Xoa_ttl Extract_redirect_is_null = null;
public static final int Redirect_max_allowed = 4;
public static final Xoa_ttl Redirect_null_ttl = null;
public static final byte[] Redirect_null_bry = Bry_.Empty;
private static final byte[] Redirect_bry = Bry_.new_a7("#REDIRECT ");
public static final Xoa_ttl Redirect_null_ttl = null;
public static final byte[] Redirect_null_bry = Bry_.Empty;
private static final byte[] Redirect_bry = Bry_.new_a7("#REDIRECT ");
public static byte[] Make_redirect_text(byte[] redirect_to_ttl) {
return Bry_.Add
( Redirect_bry // "#REDIRECT "
@@ -69,13 +70,16 @@ public class Xop_redirect_mgr {
, Xop_tkn_.Lnki_end // "]]"
);
}
public static byte[] Bld_redirect_msg(Xoae_app app, Xowe_wiki wiki, List_adp list) {
int list_len = list.Count();
if (list_len == 0) return Bry_.Empty;
public static byte[] Bld_redirect_msg(Xoae_app app, Xowe_wiki wiki, Xopg_redirect_data redirect_mgr) {
int len = redirect_mgr.Itms__len(); if (len == 0) return Bry_.Empty;
Bry_bfr redirect_bfr = Xoa_app_.Utl__bfr_mkr().Get_b512();
for (int i = 0; i < list_len; i++) {
boolean dirty = false;
for (int i = 0; i < len; i++) {
Xopg_redirect_itm redirect_itm = redirect_mgr.Itms__get_at(i);
if (!redirect_itm.By_wikitext()) continue; // ignore Special:Redirects else Special:Random will always show "redirected from"; DATE:2016-07-05
dirty = true;
if (i != 0) redirect_bfr.Add(Bry_redirect_dlm);
byte[] ttl_unders = (byte[])list.Get_at(i);
byte[] ttl_unders = redirect_itm.Ttl().Full_db();
byte[] ttl_spaces = Xoa_ttl.Replace_unders(ttl_unders);
redirect_bfr.Add(Gfh_bldr_.Bry__a_lhs_w_href) // '<a href="'
.Add(Xoh_href_.Bry__wiki) // '/wiki/'
@@ -87,6 +91,7 @@ public class Xop_redirect_mgr {
.Add(ttl_spaces) // 'PageA'
.Add(Gfh_bldr_.Bry__a_rhs); // </a>
}
if (!dirty) return Bry_.Empty; // ignore Special:Redirects else Special:Random will always show "redirected from"; DATE:2016-07-05
Xol_msg_itm msg_itm = wiki.Lang().Msg_mgr().Itm_by_id_or_null(Xol_msg_itm_.Id_redirectedfrom);
Bry_bfr fmt_bfr = app.Utl__bfr_mkr().Get_b512();
app.Tmp_fmtr().Fmt_(msg_itm.Val()).Bld_bfr_one(fmt_bfr, redirect_bfr);

View File

@@ -63,7 +63,7 @@ class Xop_redirect_mgr_fxt {
fxt.Init_page_create(tmpl_ttl_str, tmpl_wtxt_str); // create redirect_src
fxt.Init_page_create(redirect_ttl, "test"); // create redirect_trg
fxt.Test_parse_page_tmpl_tkn("{{" + tmpl_ttl_str + "}}"); // parse {{redirect_src}}
Xoa_ttl tmpl_ttl = Xoa_ttl.parse(fxt.Wiki(), Bry_.new_u8(tmpl_ttl_str));
Xoa_ttl tmpl_ttl = Xoa_ttl.Parse(fxt.Wiki(), Bry_.new_u8(tmpl_ttl_str));
Xot_defn_tmpl defn_tmpl = (Xot_defn_tmpl)fxt.Wiki().Cache_mgr().Defn_cache().Get_by_key(tmpl_ttl.Page_db()); // get defn (which parse should have created)
Tfds.Eq(expd_frame_ttl, String_.new_u8(defn_tmpl.Frame_ttl())); // check frame_ttl
}
@@ -76,9 +76,11 @@ class Xop_redirect_mgr_fxt {
Tfds.Eq(expd_str, String_.new_u8(actl_bry));
}
public void Test__redirected_html(String page_str, String expd_str) {
List_adp list = List_adp_.New();
list.Add(Bry_.new_u8(page_str));
byte[] actl_bry = Xop_redirect_mgr.Bld_redirect_msg(fxt.App(), fxt.Wiki(), list);
gplx.xowa.wikis.pages.redirects.Xopg_redirect_data redirect_mgr = new gplx.xowa.wikis.pages.redirects.Xopg_redirect_data();
Xoa_ttl ttl = fxt.Wiki().Ttl_parse(Bry_.new_u8(page_str));
Xoa_url url = Xoa_url.New(fxt.Wiki(), ttl);
redirect_mgr.Itms__add__article(url, ttl, Bry_.Empty);
byte[] actl_bry = Xop_redirect_mgr.Bld_redirect_msg(fxt.App(), fxt.Wiki(), redirect_mgr);
Tfds.Eq_str(expd_str, String_.new_u8(actl_bry));
}
}

View File

@@ -23,5 +23,5 @@ public class Xop_xnde_lxr implements Xop_lxr {
public void Init_by_lang(Xol_lang_itm lang, Btrie_fast_mgr core_trie) {}
public void Term(Btrie_fast_mgr core_trie) {}
public int Make_tkn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) {return ctx.Xnde().Make_tkn(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos);}
public static final Xop_xnde_lxr Instance = new Xop_xnde_lxr(); Xop_xnde_lxr() {}
public static final Xop_xnde_lxr Instance = new Xop_xnde_lxr(); Xop_xnde_lxr() {}
}

View File

@@ -32,6 +32,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
if (closing_tkn_tid == Xop_tkn_itm_.Tid_lnki_end) Xop_xnde_wkr_.AutoClose_handle_dangling_nde_in_caption(root, tkn); // PAGE:sr.w:Сићевачка_клисура; DATE:2014-07-03
ctx.Msg_log().Add_itm_none(Xop_xnde_log.Dangling_xnde, src, xnde.Src_bgn(), xnde.Name_end()); // NOTE: xnde.Src_bgn to start at <; xnde.Name_end b/c xnde.Src_end is -1
}
private static final Btrie_rv trv = new Btrie_rv();
public int Make_tkn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) {
if (bgn_pos == Xop_parser_.Doc_bgn_bos) bgn_pos = 0; // do not allow -1 pos
if (cur_pos == src_len) return ctx.Lxr_make_txt_(src_len); // "<" is EOS; don't raise error;
@@ -58,8 +59,13 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
}
// get node_name
Btrie_slim_mgr tag_trie = ctx.Xnde_tag_regy().Get_trie(ctx.Xnde_names_tid());
Object tag_obj = tag_trie.Match_bgn_w_byte(cur_byt, src, cur_pos, src_len); // NOTE:tag_obj can be null in wiki_tmpl mode; EX: "<ul" is not a valid tag in wiki_tmpl, but is valid in wiki_main
int atrs_bgn_pos = tag_trie.Match_pos();
Object tag_obj; int atrs_bgn_pos;
synchronized (trv) {
tag_trie.Match_at_w_b0(trv, cur_byt, src, cur_pos, src_len); // NOTE:tag_obj can be null in wiki_tmpl mode; EX: "<ul" is not a valid tag in wiki_tmpl, but is valid in wiki_main
tag_obj = trv.Obj();
atrs_bgn_pos = trv.Pos();
}
int name_bgn = cur_pos, name_end = atrs_bgn_pos;
int tag_end_pos = atrs_bgn_pos - 1;
if (tag_obj != null) {

View File

@@ -36,37 +36,39 @@ class Xop_xnde_wkr_ {
root.Subs_move(owner, subs_bgn, subs_len); // move everything after "|" back to root
}
public static int Find_xtn_end(Xop_ctx ctx, byte[] src, int open_end, int src_end, byte[] open_bry, byte[] close_bry) {
xtn_end_tag_trie.Clear();
xtn_end_tag_trie.Add_obj(Pfunc_tag.Xtag_bgn_lhs, Find_xtn_end__key__xtag);
xtn_end_tag_trie.Add_obj(open_bry, Find_xtn_end__key__bgn);
xtn_end_tag_trie.Add_obj(close_bry, Find_xtn_end__key__end);
int depth = 0;
for (int i = open_end; i < src_end; ++i) {
Object o = xtn_end_tag_trie.Match_bgn(src, i, src_end);
if (o != null) {
int tid = ((Int_obj_ref)o).Val();
switch (tid) {
case Find_xtn_end__tid__bgn: // handle nested refs; PAGE:en.w:UK; DATE:2015-12-26
int angle_end_pos = Bry_find_.Find_fwd(src, Byte_ascii.Angle_end, i, src_end); if (angle_end_pos == Bry_find_.Not_found) {Xoa_app_.Usr_dlg().Warn_many("", "", "parser.xtn: could not find angle_end: page=~{0}", ctx.Page().Url().To_str()); return Bry_find_.Not_found;}
if (src[angle_end_pos -1] == Byte_ascii.Slash) {}
else
++depth;
break;
case Find_xtn_end__tid__end: // xtn_end found; use it
if (depth == 0)
return i;
else
--depth;
break;
case Find_xtn_end__tid__xtag: // xtag found; skip over it; PAGE:it.s:La_Secchia_rapita/Canto_primo DATE:2015-12-03
int xtag_end = Find_xtag_end(ctx, src, i, src_end);
int angle_end = Bry_find_.Find_fwd(src, Byte_ascii.Angle_end, xtag_end, src_end);
i = angle_end;
break;
synchronized (xtn_end_tag_trie) { // LOCK:static-obj; DATE:2016-07-06
xtn_end_tag_trie.Clear();
xtn_end_tag_trie.Add_obj(Pfunc_tag.Xtag_bgn_lhs, Find_xtn_end__key__xtag);
xtn_end_tag_trie.Add_obj(open_bry, Find_xtn_end__key__bgn);
xtn_end_tag_trie.Add_obj(close_bry, Find_xtn_end__key__end);
int depth = 0;
for (int i = open_end; i < src_end; ++i) {
Object o = xtn_end_tag_trie.Match_bgn(src, i, src_end);
if (o != null) {
int tid = ((Int_obj_ref)o).Val();
switch (tid) {
case Find_xtn_end__tid__bgn: // handle nested refs; PAGE:en.w:UK; DATE:2015-12-26
int angle_end_pos = Bry_find_.Find_fwd(src, Byte_ascii.Angle_end, i, src_end); if (angle_end_pos == Bry_find_.Not_found) {Xoa_app_.Usr_dlg().Warn_many("", "", "parser.xtn: could not find angle_end: page=~{0}", ctx.Page().Url().To_str()); return Bry_find_.Not_found;}
if (src[angle_end_pos -1] == Byte_ascii.Slash) {}
else
++depth;
break;
case Find_xtn_end__tid__end: // xtn_end found; use it
if (depth == 0)
return i;
else
--depth;
break;
case Find_xtn_end__tid__xtag: // xtag found; skip over it; PAGE:it.s:La_Secchia_rapita/Canto_primo DATE:2015-12-03
int xtag_end = Find_xtag_end(ctx, src, i, src_end);
int angle_end = Bry_find_.Find_fwd(src, Byte_ascii.Angle_end, xtag_end, src_end);
i = angle_end;
break;
}
}
}
return Bry_find_.Not_found;
}
return Bry_find_.Not_found;
}
public static int Find_xtag_end(Xop_ctx ctx, byte[] src, int pos, int src_end) {
int xtag_bgn = pos + Pfunc_tag.Xtag_bgn_lhs.length;

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.xndes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import org.junit.*;
public class Xop_xnde_wkr__include_basic_tst {
private final Xop_fxt fxt = new Xop_fxt();
private final Xop_fxt fxt = new Xop_fxt();
@Before public void init() {fxt.Reset();}
@Test public void Tmpl_includeonly() {fxt.Test_parse_tmpl_str_test("a<includeonly>b</includeonly>c" , "{{test}}", "abc");}
@Test public void Tmpl_noinclude() {fxt.Test_parse_tmpl_str_test("a<noinclude>b</noinclude>c" , "{{test}}", "ac");}