diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java b/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java
index 5116b0905..b8a4222ce 100644
--- a/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java
+++ b/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java
@@ -50,7 +50,7 @@ public class Xob_page_wkr_cmd implements Xob_cmd {
Err_.Noop(e);
long dividend = fil.Fil_pos();
if (dividend >= fil_len) dividend = fil_len - 1; // prevent % from going over 100
- String msg = Decimal_adp_.CalcPctStr(dividend, fil_len, "00.00") + "|" + String_.new_u8(page.Ttl_full_db()) + "|" + Err_.Message_gplx_log(e) + "|" + Xot_tmpl_wtr.Err_string; Xot_tmpl_wtr.Err_string = "";
+ String msg = Decimal_adp_.CalcPctStr(dividend, fil_len, "00.00") + "|" + String_.new_u8(page.Ttl_full_db()) + "|" + Err_.Message_gplx_log(e);
bldr.Usr_dlg().Log_wkr().Log_to_session(msg);
Console_adp__sys.Instance.Write_str_w_nl(msg);
}
diff --git a/400_xowa/src/gplx/xowa/htmls/core/makes/tests/Xoh_make_fxt.java b/400_xowa/src/gplx/xowa/htmls/core/makes/tests/Xoh_make_fxt.java
index bab176024..03af24c02 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/makes/tests/Xoh_make_fxt.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/makes/tests/Xoh_make_fxt.java
@@ -33,8 +33,9 @@ public class Xoh_make_fxt {
) {
// fxt.Init_cache("en.wikipedia.org", "A.png", 0, 220, 110, 0.5, -1, -1, Bool_.Y, "B.png", 330, 110, -1, -1);
}
- public void Test__html(String wtxt, String expd) {
- expd = String_.Replace(expd, "'", "\"");
+ public void Test__html(String wtxt, String expd) {Test__html(wtxt, expd, true);}
+ public void Test__html(String wtxt, String expd, boolean escape_apos) {
+ if (escape_apos) expd = String_.Replace(expd, "'", "\"");
String actl = parser_fxt.Exec__parse_to_hdump(wtxt);
Tfds.Eq_str_lines(expd, actl);
}
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html_tst.java
index f1b7cfced..dd153cb60 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html_tst.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html_tst.java
@@ -35,13 +35,13 @@ public class Xoh_hdr_html_tst {
));
}
@Test public void Uniq() {
- byte[] uniq = fxt.Parser_fxt().Wiki().Parser_mgr().Uniq_mgr().Add(Bry_.new_a7("bcd"));
fxt.Test__html(String_.Concat_lines_nl_skip_last
- ( "== a" + String_.new_u8(uniq) + "e =="
+ ( "== a e =="
, "text"
), String_.Concat_lines_nl_skip_last
- ( "
abcde
"
+ ( " a c e
"
, "text"
- ));
+ )
+ , false);
}
}
diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser.java
index 9d5815de8..b5039f27a 100644
--- a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser.java
+++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser.java
@@ -217,7 +217,7 @@ public class Xow_popup_parser {
int subs_len = tmpl_root.Subs_len();
for (int i = 0; i < subs_len; i++)
tmpl_root.Subs_get(i).Tmpl_compile(tmpl_ctx, src, tmpl_props);
- return Xot_tmpl_wtr.Instance.Write_all(tmpl_ctx, tmpl_root, src);
+ return Xot_tmpl_wtr.Write_all(tmpl_ctx, tmpl_root, src);
}
}
class Xow_popup_parser_ {
diff --git a/400_xowa/src/gplx/xowa/parsers/Xop_parser.java b/400_xowa/src/gplx/xowa/parsers/Xop_parser.java
index 8918aab77..20b6cbfeb 100644
--- a/400_xowa/src/gplx/xowa/parsers/Xop_parser.java
+++ b/400_xowa/src/gplx/xowa/parsers/Xop_parser.java
@@ -46,7 +46,7 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ
int len = root.Subs_len();
for (int i = 0; i < len; ++i)
root.Subs_get(i).Tmpl_compile(ctx, src, tmpl_props);
- return Xot_tmpl_wtr.Instance.Write_all(ctx, root, src);
+ return Xot_tmpl_wtr.Write_all(ctx, root, src);
}
public byte[] Parse_text_to_html(Xop_ctx ctx, byte[] src) {
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 c0169ddbf..6b15ba1d2 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
@@ -17,15 +17,16 @@ package gplx.xowa.parsers.tmpls; import gplx.*; import gplx.xowa.*; import gplx.
import gplx.core.envs.*;
import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.miscs.*;
public class Xot_tmpl_wtr {
- public byte[] Write_all(Xop_ctx ctx, Xop_root_tkn root, byte[] src) {
- Bry_bfr rslt_bfr = ctx.Wiki().Utl__bfr_mkr().Get_m001();
- rslt_bfr.Reset_if_gt(Io_mgr.Len_mb);
- Write_tkn(rslt_bfr, ctx, src, src.length, root);
- return rslt_bfr.To_bry_and_rls();
+ 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
}
- private void Write_tkn(Bry_bfr rslt_bfr, Xop_ctx ctx, byte[] src, int src_len, Xop_tkn_itm tkn) {
+ 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()) {
- case Xop_tkn_itm_.Tid_root: // write each sub
+ case Xop_tkn_itm_.Tid_root: // write each sub
int subs_len = tkn.Subs_len();
for (int i = 0; i < subs_len; i++) {
Xop_tkn_itm sub_tkn = tkn.Subs_get(i);
@@ -94,15 +95,13 @@ public class Xot_tmpl_wtr {
tkn.Tmpl_evaluate(ctx, src, Xot_invk_temp.Page_is_caller.Src_(src), rslt_bfr);
}
catch (Exception e) {
- Err_string = String_.new_u8(src, tkn.Src_bgn(), tkn.Src_end()) + "|" + Type_adp_.NameOf_obj(e) + "|" + Err_.Cast_or_make(e).To_str__log();
+ String err_string = String_.new_u8(src, tkn.Src_bgn(), tkn.Src_end()) + "|" + Type_adp_.NameOf_obj(e) + "|" + Err_.Cast_or_make(e).To_str__log();
if (Env_.Mode_testing())
- throw Err_.new_exc(e, "xo", Err_string);
+ throw Err_.new_exc(e, "xo", err_string);
else
- ctx.App().Usr_dlg().Warn_many("", "", "failed to write tkn: page=~{0} err=~{1}", String_.new_u8(ctx.Page().Ttl().Page_db()), Err_string);
+ ctx.App().Usr_dlg().Warn_many("", "", "failed to write tkn: page=~{0} err=~{1}", String_.new_u8(ctx.Page().Ttl().Page_db()), err_string);
}
break;
}
}
- public static String Err_string = "";
- public static final Xot_tmpl_wtr Instance = new Xot_tmpl_wtr(); Xot_tmpl_wtr() {}
}
diff --git a/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr.java b/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr.java
index 05c153c8b..5c4e1a094 100644
--- a/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr.java
+++ b/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr.java
@@ -21,9 +21,10 @@ public class Xop_uniq_mgr { // REF.MW:/parser/StripState.php
private int idx = -1;
public void Clear() {idx = -1; general_trie.Clear();}
public byte[] Get(byte[] key) {return (byte[])general_trie.Match_exact(key, 0, key.length);}
- public byte[] Add(byte[] val) { // "" -> "\u007fUNIQ-item-1--QINU\u007f"
+ public byte[] Add(byte[] type, byte[] val) {// "" -> "\u007fUNIQ-item-1--QINU\u007f"
byte[] key = key_bfr
- .Add(Bry__uniq__add__bgn)
+ .Add(Bry__uniq__bgn_w_dash)
+ .Add(type).Add_byte(Byte_ascii.Dash) // EX: "ref-"
.Add_int_variable(++idx)
.Add(Bry__uniq__add__end).To_bry_and_clear();
general_trie.Add_bry_bry(key, val);
@@ -36,10 +37,20 @@ public class Xop_uniq_mgr { // REF.MW:/parser/StripState.php
int cur = 0;
int len = src.length;
while (cur < len) {
- // look for \u007fUNIQ
- int uniq_bgn = Bry_find_.Find_fwd(src, Bry__uniq__add__bgn, cur);
+ // find "\u007fUNIQ-"
+ int uniq_bgn = Bry_find_.Find_fwd(src, Bry__uniq__bgn_w_dash, cur);
if (uniq_bgn == Bry_find_.Not_found) break;
- int uniq_end = Bry_find_.Find_fwd(src, Bry__uniq__add__end, uniq_bgn);
+
+ // find "-"; EX: ref-
+ int tmp_pos = uniq_bgn;
+ tmp_pos = Bry_find_.Find_fwd(src, Byte_ascii.Dash, tmp_pos, len);
+ if (tmp_pos == Bry_find_.Not_found) {
+ Gfo_usr_dlg_.Instance.Warn_many("", "", "uniq_mgr:unable to find 2nd dash; src=~{0}", src);
+ return src;
+ }
+
+ // find end
+ int uniq_end = Bry_find_.Find_fwd(src, Bry__uniq__add__end, tmp_pos);
if (uniq_end == Bry_find_.Not_found) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "uniq_mgr:unable to convert uniq; src=~{0}", src);
return src;
@@ -111,10 +122,10 @@ public class Xop_uniq_mgr { // REF.MW:/parser/StripState.php
key_bfr.Clear();
return rv;
}
- private final static byte[]
+
+ private static final byte[]
Bry__uniq__bgn = Bry_.new_a7("\u007fUNIQ")
- // , Bry__uniq__end = Bry_.new_a7("-QINU\u007f")
- , Bry__uniq__add__bgn = Bry_.new_a7("\u007fUNIQ-item-")
+ , Bry__uniq__bgn_w_dash = Bry_.new_a7("\u007fUNIQ-")
, Bry__uniq__add__end = Bry_.new_a7("--QINU\u007f")
;
}
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
new file mode 100644
index 000000000..c9738a84d
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr__parse__tst.java
@@ -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.parsers.uniqs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
+import org.junit.*; import gplx.core.tests.*;
+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");
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr__tst.java b/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr__tst.java
index b500c13d8..fc8049360 100644
--- a/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr__tst.java
+++ b/400_xowa/src/gplx/xowa/parsers/uniqs/Xop_uniq_mgr__tst.java
@@ -65,7 +65,7 @@ class Xop_uniq_mgr__fxt {
Gftest.Eq__str(expd, String_.new_a7(mgr.Uniq_bry_new()), "unique_bry");
}
public void Test__add(String raw, String expd) {
- Gftest.Eq__str(expd, String_.new_a7(mgr.Add(Bry_.new_a7(raw))), "add");
+ Gftest.Eq__str(expd, String_.new_a7(mgr.Add(Bry_.new_a7("item"), Bry_.new_a7(raw))), "add");
}
public void Test__get(String key, String expd) {
Gftest.Eq__str(expd, String_.new_a7(mgr.Get(Bry_.new_a7(key))), "get");
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 5d088f09b..acbfdae9d 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
@@ -105,14 +105,33 @@ public class Xop_xnde_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn {
break;
default: // ignore tags except for xtn; NOTE: Xtn tags are part of tagRegy_wiki_tmpl stage
if (tag.Xtn()) {
- bfr.Add_mid(src, tag_open_bgn, tag_open_end); // write tag_bgn
- for (int i = 0; i < subs_len; i++) // always evaluate subs; handle {{{1}}}; DATE:2014-03-03
- this.Subs_get(i).Tmpl_evaluate(ctx, src, caller, bfr);
- bfr.Add_mid(src, tag_close_bgn, tag_close_end); // write tag_end
- if (tag_close_bgn == Int_.Min_value) {// xtn is unclosed; add a else rest of page will be gobbled; PAGE:en.w:Provinces_and_territories_of_Canada DATE:2014-11-13
- bfr.Add(tag.Xtn_end_tag());
- bfr.Add(Byte_ascii.Gt_bry);
+ 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);
+// }
+
+ // write tag_bgn; EX:
+ cur_bfr.Add_mid(src, tag_open_bgn, tag_open_end);
+
+ // write subs; must always evaluate subs; handle {{{1}}}; DATE:2014-03-03
+ for (int i = 0; i < subs_len; i++)
+ this.Subs_get(i).Tmpl_evaluate(ctx, src, caller, cur_bfr);
+
+ // write tag_end; EX:
+ cur_bfr.Add_mid(src, tag_close_bgn, tag_close_end);
+
+ // xtn is unclosed; add a else rest of page will be gobbled; PAGE:en.w:Provinces_and_territories_of_Canada DATE:2014-11-13
+ if (tag_close_bgn == Int_.Min_value) {
+ cur_bfr.Add(tag.Xtn_end_tag());
+ 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);
+// }
}
break;
}
diff --git a/400_xowa/src/gplx/xowa/xtns/math/Xomath_html_wtr.java b/400_xowa/src/gplx/xowa/xtns/math/Xomath_html_wtr.java
index c871ea60c..9af4c23be 100644
--- a/400_xowa/src/gplx/xowa/xtns/math/Xomath_html_wtr.java
+++ b/400_xowa/src/gplx/xowa/xtns/math/Xomath_html_wtr.java
@@ -24,6 +24,7 @@ class Xomath_html_wtr {
private final Bry_fmt
fmt__latex = Bry_fmt.Auto( "
~{math_text}")
, fmt__mathjax = Bry_fmt.Auto("~{math_text}");
+ private static final byte[] Bry__math = Bry_.new_a7("math");
public void Write(Bry_bfr bfr, Xop_ctx ctx, Xop_xnde_tkn xnde, byte[] src, boolean is_latex, boolean enabled) {
// init vars
@@ -66,7 +67,7 @@ class Xomath_html_wtr {
}
// write html: math_expr
- byte[] unique_bry = wiki.Parser_mgr().Uniq_mgr().Add(math_bry);
+ byte[] unique_bry = wiki.Parser_mgr().Uniq_mgr().Add(Bry__math, math_bry);
Bry_fmt fmt = is_latex ? fmt__latex : fmt__mathjax;
fmt.Bld_many(tmp_bfr, uid, unique_bry);
bfr.Add_bfr_and_clear(tmp_bfr);