From 83c40c8771ce1dc6c3df6c9b5c0e7ae38d494916 Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Fri, 31 Mar 2017 19:17:47 -0400 Subject: [PATCH] Parser: Add more support for UNIQ substitutions with extension tags --- 400_xowa/src/gplx/xowa/Xoa_app_.java | 4 +-- .../gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java | 5 ++-- .../uniqs/Xop_uniq_mgr__parse__tst.java | 6 ++-- .../gplx/xowa/parsers/xndes/Xop_xnde_tkn.java | 20 +++++++------ .../gplx/xowa/parsers/xndes/Xop_xnde_wkr.java | 7 +---- .../xowa/parsers/xndes/Xop_xnde_wkr_.java | 22 ++------------ .../xowa/xtns/pfuncs/strings/Pfunc_tag.java | 30 +++++-------------- 7 files changed, 30 insertions(+), 64 deletions(-) diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index 6efe26a6f..8886a5da9 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -30,8 +30,8 @@ public class Xoa_app_ { } } public static final String Name = "xowa"; - public static final int Version_id = 521; - public static final String Version = "4.5.0.1703"; + public static final int Version_id = 522; + public static final String Version = "4.5.1.1703"; public static String Build_date = "2012-12-30 00:00:00"; public static String Build_date_fmt = "yyyy-MM-dd HH:mm:ss"; public static String Op_sys_str; diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java index 6b15ba1d2..1a1917a2b 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java @@ -20,9 +20,8 @@ public class Xot_tmpl_wtr { public static byte[] Write_all(Xop_ctx ctx, Xop_root_tkn root, byte[] src) { Bry_bfr bfr = ctx.Wiki().Utl__bfr_mkr().Get_m001().Reset_if_gt(Io_mgr.Len_mb); Write_tkn(bfr, ctx, src, src.length, root); - return bfr.To_bry_and_rls(); -// byte[] rv = bfr.To_bry_and_rls(); -// return ctx.Wiki().Parser_mgr().Uniq_mgr().Parse(rv); // NOTE: noops if no UNIQs + byte[] rv = bfr.To_bry_and_rls(); + return ctx.Wiki().Parser_mgr().Uniq_mgr().Parse(rv); // NOTE: noops if no UNIQs; // UNIQ; DATE:2017-03-31 } private static void Write_tkn(Bry_bfr rslt_bfr, Xop_ctx ctx, byte[] src, int src_len, Xop_tkn_itm tkn) { switch (tkn.Tkn_tid()) { diff --git a/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr__parse__tst.java b/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr__parse__tst.java index c9738a84d..af033a38f 100644 --- a/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr__parse__tst.java +++ b/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr__parse__tst.java @@ -19,8 +19,8 @@ public class Xop_uniq_mgr__parse__tst { private final Xop_fxt fxt = Xop_fxt.New_app_html(); @Before public void init() {fxt.Reset();} @Test public void Ref_becomes_UNIQ() { -// String wikitext = "b"; -// fxt.Init_defn_add("test", "{{#ifeq:{{{1}}}|a" + wikitext + "c|fail|pass}}"); // fail if {{{1}}} is still wikitext; should be UNIQ -// fxt.Test__parse__tmpl_to_html("{{test|a" + wikitext + "c}}", "pass"); + String wikitext = "b"; + fxt.Init_defn_add("test", "{{#ifeq:{{{1}}}|a" + wikitext + "c|fail|pass}}"); // fail if {{{1}}} is still wikitext; should be UNIQ + fxt.Test__parse__tmpl_to_html("{{test|a" + wikitext + "c}}", "pass"); } } diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tkn.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tkn.java index acbfdae9d..644788f58 100644 --- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tkn.java @@ -106,10 +106,11 @@ public class Xop_xnde_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn { default: // ignore tags except for xtn; NOTE: Xtn tags are part of tagRegy_wiki_tmpl stage if (tag.Xtn()) { Bry_bfr cur_bfr = bfr; -// boolean is_tmpl_mode = ctx.Wiki().Parser_mgr().Ctx().Parse_tid() == Xop_parser_tid_.Tid__tmpl; -// if (is_tmpl_mode) { -// cur_bfr = ctx.Wiki().Utl__bfr_mkr().Get_m001().Reset_if_gt(Io_mgr.Len_mb); -// } + // UNIQ; DATE:2017-03-31 + boolean is_tmpl_mode = ctx.Wiki().Parser_mgr().Ctx().Parse_tid() == Xop_parser_tid_.Tid__tmpl; + if (is_tmpl_mode) { + cur_bfr = ctx.Wiki().Utl__bfr_mkr().Get_m001().Reset_if_gt(Io_mgr.Len_mb); + } // write tag_bgn; EX: cur_bfr.Add_mid(src, tag_open_bgn, tag_open_end); @@ -127,11 +128,12 @@ public class Xop_xnde_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn { cur_bfr.Add(Byte_ascii.Gt_bry); } -// if (is_tmpl_mode) { -// byte[] val = cur_bfr.To_bry_and_clear(); -// byte[] key = ctx.Wiki().Parser_mgr().Uniq_mgr().Add(tag.Name_bry(), val); -// bfr.Add(key); -// } + // UNIQ; DATE:2017-03-31 + if (is_tmpl_mode) { + byte[] val = cur_bfr.To_bry_and_clear(); + byte[] key = ctx.Wiki().Parser_mgr().Uniq_mgr().Add(tag.Name_bry(), val); + bfr.Add(key); + } } break; } diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java index bac5e7964..225bbea98 100644 --- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java @@ -545,12 +545,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { return found ? rv : Bry_find_.Not_found; } private int Find_xtn_end_lhs(Xop_ctx ctx, Xop_xnde_tag tag, byte[] src, int src_len, int open_bgn, int open_end, byte[] open_bry, byte[] close_bry) { - int tag_bgn = open_bgn - Pfunc_tag.Xtag_len; - if (tag_bgn > -1 - && Bry_.Eq(src, tag_bgn, tag_bgn, Pfunc_tag.Xtag_bgn_lhs)) // xtn created by tag - return Xop_xnde_wkr_.Find_xtag_end(ctx, src, open_end, src_len); - else // search rest of String for case-insensitive name; NOTE: used to do CS first, then fall-back on CI; DATE:2013-12-02 - return Xop_xnde_wkr_.Find_xtn_end(ctx, src, open_end, src_len, open_bry, close_bry); + return Xop_xnde_wkr_.Find_xtn_end(ctx, src, open_end, src_len, open_bry, close_bry); // UNIQ; DATE:2017-03-31 } private int Make_xnde_xtn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, Xop_xnde_tag tag, int open_bgn, int open_end, int name_bgn, int name_end, int atrs_bgn, int atrs_end, Mwh_atr_itm[] atrs, boolean inline, boolean pre2_hack) { // NOTE: find end_tag that exactly matches bgnTag; must be case sensitive; diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr_.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr_.java index bd6e479ab..80e630d0a 100644 --- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr_.java +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr_.java @@ -30,9 +30,9 @@ 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) { + // UNIQ; DATE:2017-03-31 Btrie_slim_mgr xtn_end_tag_trie = ctx.Tmp_mgr().Xnde__xtn_end(); 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; @@ -53,30 +53,14 @@ class Xop_xnde_wkr_ { 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; } - 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; - int tag_id = Bry_.To_int_or(src, xtag_bgn, xtag_bgn + Pfunc_tag.Id_len, -1); if (tag_id == -1) {Xoa_app_.Usr_dlg().Warn_many("", "", "parser.xtn: could not extract id from xtag_bgn: page=~{0}", ctx.Page().Url().To_str()); return Bry_find_.Not_found;} - Bry_bfr tmp_bfr = ctx.Wiki().Utl__bfr_mkr().Get_b128(); - tmp_bfr.Add(Pfunc_tag.Xtag_end_lhs).Add_int_pad_bgn(Byte_ascii.Num_0, Pfunc_tag.Id_len, tag_id).Add(Pfunc_tag.Xtag_rhs); - byte[] tag_end = tmp_bfr.To_bry_and_clear(); - tmp_bfr.Mkr_rls(); - int rv = Bry_find_.Find_fwd(src, tag_end, pos + Pfunc_tag.Xtag_rhs.length); if (rv == Bry_find_.Not_found) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not find xtag end: page=~{0}", ctx.Page().Url().To_str()); return Bry_find_.Not_found;} - rv = Bry_find_.Find_bwd(src, Byte_ascii.Lt, rv - 1); if (rv == Bry_find_.Not_found) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not find <: page=~{0}", ctx.Page().Url().To_str()); return Bry_find_.Not_found;} - return rv; - } - private static final int Find_xtn_end__tid__bgn = 0, Find_xtn_end__tid__end = 1, Find_xtn_end__tid__xtag = 2; + private static final int Find_xtn_end__tid__bgn = 0, Find_xtn_end__tid__end = 1;//, Find_xtn_end__tid__xtag = 2; private static final Int_obj_val Find_xtn_end__key__bgn = new Int_obj_val(Find_xtn_end__tid__bgn) , Find_xtn_end__key__end = new Int_obj_val(Find_xtn_end__tid__end) - , Find_xtn_end__key__xtag = new Int_obj_val(Find_xtn_end__tid__xtag); + ; } diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag.java index 4d97e92c6..6aba0094b 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag.java @@ -16,7 +16,7 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt package gplx.xowa.xtns.pfuncs.strings; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.tmpls.*; -public class Pfunc_tag extends Pf_func_base { +public class Pfunc_tag extends Pf_func_base {// REF:CoreParserFunctions.php @Override public int Id() {return Xol_kwd_grp_.Id_misc_tag;} @Override public Pf_func New(int id, byte[] name) {return new Pfunc_tag().Name_(name);} @Override public boolean Func_require_colon_arg() {return true;} @@ -24,15 +24,10 @@ public class Pfunc_tag extends Pf_func_base { // make based on {{#tag}}; EX: {{#tag:ref|a|name=1}} -> a Bry_bfr tmp_bfr = ctx.Wiki().Utl__bfr_mkr().Get_b512(); try { - // get tag_idx, tag_data, and tag_is_ref - int tag_idx = ctx.Wiki().Parser_mgr().Tag__next_idx(); + // get vars byte[] tag_name = Eval_argx(ctx, src, caller, self); if (tag_name.length == 0) return; - Xop_xnde_tag tag = (Xop_xnde_tag)ctx.Xnde_tag_regy().Get_trie(ctx.Xnde_names_tid()).Match_exact(tag_name, 0, tag_name.length); - boolean tag_is_ref = tag != null && tag.Id() == Xop_xnde_tag_.Tid__ref; - + // open tag - if (tag_is_ref) // ; add to handle nested refs; PAGE:en.w:Battle_of_Midway; DATE:2014-06-27 - tmp_bfr.Add(Xtag_bgn_lhs).Add_int_pad_bgn(Byte_ascii.Num_0, 10, tag_idx).Add(Xtag_rhs); tmp_bfr.Add_byte(Byte_ascii.Lt).Add(tag_name); // EX: " "a='1' b='2'" @@ -54,21 +49,12 @@ public class Pfunc_tag extends Pf_func_base { // close tag tmp_bfr.Add_byte(Byte_ascii.Lt).Add_byte(Byte_ascii.Slash).Add(tag_name).Add_byte(Byte_ascii.Gt); // EX: "" - if (tag_is_ref) // ; add to handle nested refs; PAGE:en.w:Battle_of_Midway; DATE:2014-06-27 - tmp_bfr.Add(Xtag_end_lhs).Add_int_pad_bgn(Byte_ascii.Num_0, 10, tag_idx).Add(Xtag_rhs); - bfr.Add_bfr_and_clear(tmp_bfr); + + // add to UNIQ hash; DATE:2017-03-31 + byte[] val = tmp_bfr.To_bry_and_clear(); + byte[] key = ctx.Wiki().Parser_mgr().Uniq_mgr().Add(tag_name, val); + bfr.Add(key); } finally {tmp_bfr.Mkr_rls();} } - - public static final byte[] - Xtag_bgn_lhs = Bry_.new_a7("") - ; - public static final int - Xtag_len = 27 // - , Xtag_bgn = 14 //