mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
Parser: Add more support for UNIQ substitutions with extension tags
This commit is contained in:
@@ -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()) {
|
||||
|
||||
@@ -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 = "<ref>b</ref>";
|
||||
// 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 = "<ref>b</ref>";
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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: <poem>
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user