mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
v1.7.1.1
This commit is contained in:
@@ -62,7 +62,7 @@ class Xop_brack_end_lxr implements Xop_lxr {
|
||||
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) {
|
||||
int acs_pos = ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_brack_bgn);
|
||||
if (acs_pos != -1 && ctx.Cur_tkn_tid() != Xop_tkn_itm_.Tid_tmpl_curly_bgn) // NOTE: do not pop tkn if inside tmpl; EX: [[a|{{#switch:{{{1}}}|b=c]]|d=e]]|f]]}}
|
||||
ctx.Stack_pop_til(root, src, acs_pos, true, bgn_pos, cur_pos);
|
||||
ctx.Stack_pop_til(root, src, acs_pos, true, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_tmpl_curly_bgn);
|
||||
Xop_tkn_itm tkn = tkn_mkr.Brack_end(bgn_pos, cur_pos);
|
||||
ctx.Subs_add(root, tkn);
|
||||
return cur_pos;
|
||||
|
||||
@@ -57,21 +57,28 @@ public class Xop_curly_wkr implements Xop_ctx_wkr {
|
||||
return lxr_end_pos;
|
||||
}
|
||||
|
||||
Xop_curly_bgn_tkn bgn_tkn = (Xop_curly_bgn_tkn)ctx.Stack_pop_til(root, src, acs_pos, true, lxr_bgn_pos, lxr_end_pos); // NOTE: in theory, an unclosed [[ can be on stack; for now, ignore
|
||||
Xop_curly_bgn_tkn bgn_tkn = (Xop_curly_bgn_tkn)ctx.Stack_pop_til(root, src, acs_pos, true, lxr_bgn_pos, lxr_end_pos, Xop_tkn_itm_.Tid_tmpl_curly_bgn); // NOTE: in theory, an unclosed [[ can be on stack; for now, ignore
|
||||
int bgn_tkn_len = bgn_tkn.Src_end() - bgn_tkn.Src_bgn();
|
||||
int bgn_tkn_pos_bgn = bgn_tkn.Src_bgn();// save original pos_bgn
|
||||
boolean vnt_dash_adjust = false;
|
||||
if (vnt_enabled) {
|
||||
if (vnt_enabled ) {
|
||||
int curly_bgn_dash = bgn_tkn.Src_bgn() - 1;
|
||||
if (curly_bgn_dash > -1 && src[curly_bgn_dash] == Byte_ascii.Dash) { // "-" before curlies; EX: "-{{"
|
||||
if (curly_bgn_dash > -1 && src[curly_bgn_dash] == Byte_ascii.Dash) { // "-" exists before curlies; EX: "-{{"
|
||||
int curly_end_dash = lxr_end_pos;
|
||||
if (curly_end_dash < src_len && src[curly_end_dash] == Byte_ascii.Dash) { // "-" after curlies; EX: "}}-"
|
||||
if (curly_end_dash < src_len && src[curly_end_dash] == Byte_ascii.Dash) { // "-" exists after curlies; EX: "}}-"
|
||||
if (bgn_tkn_len > 2 && end_tkn_len > 2) { // more than 3 curlies at bgn / end with flanking dashes; EX: "-{{{ }}}-"; NOTE: 3 is needed b/c 2 will never be reduced; EX: "-{{" will always be "-" and "{{", not "-{" and "{"
|
||||
--bgn_tkn_len; // reduce bgn curlies by 1; EX: "{{{" -> "{{"
|
||||
++bgn_tkn_pos_bgn; // add one to bgn tkn_pos;
|
||||
--end_tkn_len; // reduce end curlies by 1; EX: "}}}" -> "}}"
|
||||
--lxr_end_pos; // reduce end by 1; this will "reprocess" the final "}" as a text tkn; EX: "}}}-" -> "}}" and position before "}-"
|
||||
vnt_dash_adjust = true;
|
||||
int numeric_val = Bry_.X_to_int_or(src, bgn_tkn.Src_end(), lxr_bgn_pos, -1);
|
||||
if ( numeric_val != -1 // do not apply if numeric val; EX:"-{{{0}}}-" vs "-{{{#expr:0}}}-" sr.w:Template:Link_FA
|
||||
&& bgn_tkn_len == 3 && end_tkn_len == 3 // exactly 3 tokens; assume param token; "-{{{" -> "-" + "{{{" x> -> "-{" + "{{"; if unbalanced (3,4 or 4,3) fall into code below
|
||||
) {
|
||||
} // noop; PAGE:sr.w:ДНК; EX:<span id="interwiki-{{{1}}}-fa"></span> DATE:2014-07-03
|
||||
else {
|
||||
--bgn_tkn_len; // reduce bgn curlies by 1; EX: "{{{" -> "{{"
|
||||
++bgn_tkn_pos_bgn; // add one to bgn tkn_pos;
|
||||
--end_tkn_len; // reduce end curlies by 1; EX: "}}}" -> "}}"
|
||||
--lxr_end_pos; // reduce end by 1; this will "reprocess" the final "}" as a text tkn; EX: "}}}-" -> "}}" and position before "}-"
|
||||
vnt_dash_adjust = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ public class Xot_defn_trace_dbg implements Xot_defn_trace {
|
||||
if (bb.Len() != 0) bb.Add_byte_nl(); // only add newLine if something in bb; needed for tests
|
||||
bb .Add(Ary_source_lbl)
|
||||
.Add(src).Add_byte_nl();
|
||||
bb.Add_bfr(bfr);
|
||||
bb.Add_bfr_and_preserve(bfr);
|
||||
bfr.Clear();
|
||||
}
|
||||
public void Clear() {bfr.Clear(); indent = 0; count = 0;}
|
||||
|
||||
@@ -68,7 +68,7 @@ class Xot_fmtr_prm implements Xot_fmtr {
|
||||
}
|
||||
self_tkn.Val_tkn().Tmpl_fmt(ctx, src, this);
|
||||
}
|
||||
public void Print(Bry_bfr bb) {bb.Add_bfr(trg); trg.Clear(); depth = 0;}
|
||||
public void Print(Bry_bfr bb) {bb.Add_bfr_and_preserve(trg); trg.Clear(); depth = 0;}
|
||||
Bry_bfr trg = Bry_bfr.new_(); int depth = 0;
|
||||
public static final Xot_fmtr_prm _ = new Xot_fmtr_prm();
|
||||
}
|
||||
|
||||
@@ -43,12 +43,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 byte[] Comment_tkn = Bry_.new_ascii_("<!---->");
|
||||
@Override public boolean Tmpl_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Bry_bfr bfr) { // EX: this="{{t|{{{0}}}}}" caller="{{t|1}}"
|
||||
if (ctx.Tid_is_popup() && this.Src_end() - this.Src_bgn() > ctx.Tmpl_tkn_max()) { // popup && cur_tmpl > tmpl_max
|
||||
bfr.Add(Comment_tkn); // add comment tkn; need something to separate ''{{lang|la|Ragusa}}'' else will become ''''; PAGE:en.w:Republic_of_Ragusa; DATE:2014-06-28
|
||||
return false;
|
||||
}
|
||||
boolean rv = false;
|
||||
Xot_defn defn = tmpl_defn; Xow_wiki wiki = ctx.Wiki(); Xol_lang lang = wiki.Lang();
|
||||
byte[] name_ary = defn.Name(), argx_ary = Bry_.Empty; Arg_itm_tkn name_key_tkn = name_tkn.Key_tkn();
|
||||
@@ -172,6 +167,9 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
|
||||
name_ary = Bry_.Mid(name_ary, 0, colon_pos);
|
||||
}
|
||||
if (defn == Xot_defn_.Null) {
|
||||
if (ctx.Tid_is_popup()) { // popup && cur_tmpl > tmpl_max
|
||||
if (Popup_skip(ctx, name_ary, bfr)) return false;
|
||||
}
|
||||
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; EX.WP:Human evolution and {{:Human evolution/Species chart}}; && ctx.Tmpl_whitelist().Has(name_ary)
|
||||
@@ -283,6 +281,25 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
|
||||
}
|
||||
return rv;
|
||||
} private static final byte[] Ary_unknown_bgn = Bry_.new_ascii_("(? [["), Ary_unknown_end = Bry_.new_ascii_("]] ?)"), Ary_dynamic_is_blank = Bry_.new_ascii_("dynamic is blank");
|
||||
private boolean Popup_skip(Xop_ctx ctx, byte[] ttl, Bry_bfr bfr) {
|
||||
boolean skip = false;
|
||||
skip = this.Src_end() - this.Src_bgn() > ctx.Tmpl_tkn_max();
|
||||
if (!skip) {
|
||||
gplx.xowa.html.modules.popups.keeplists.Xop_keeplist_wiki tmpl_keeplist = ctx.Tmpl_keeplist();
|
||||
if (tmpl_keeplist != null && tmpl_keeplist.Enabled()) {
|
||||
byte[] ttl_lower = Xoa_ttl.Replace_spaces(ctx.Wiki().Lang().Case_mgr().Case_build_lower(ttl));
|
||||
skip = !tmpl_keeplist.Match(ttl_lower);
|
||||
// if (skip)
|
||||
// Tfds.Write_bry(ttl_lower);
|
||||
}
|
||||
}
|
||||
if (skip) {
|
||||
bfr.Add(gplx.xowa.html.modules.popups.Xow_popup_parser.Comment_tkn); // add comment tkn; need something to separate ''{{lang|la|Ragusa}}'' else will become ''''; PAGE:en.w:Republic_of_Ragusa; DATE:2014-06-28
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
public static void Eval_func(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk invk, Bry_bfr bfr, Xot_defn defn, byte[] argx_ary) {
|
||||
Pf_func_base defn_func = (Pf_func_base)defn;
|
||||
int defn_func_id = defn_func.Id();
|
||||
|
||||
@@ -18,32 +18,32 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.xowa; import gplx.*;
|
||||
public class Xot_tmpl_wtr {
|
||||
public byte[] Write_all(Xop_ctx ctx, Xop_root_tkn root, byte[] src) {
|
||||
Bry_bfr trg = ctx.App().Utl_bry_bfr_mkr().Get_m001();
|
||||
ctx.Tmpl_output_(trg);
|
||||
trg.Reset_if_gt(Io_mgr.Len_mb);
|
||||
Write_tkn(ctx, src, src.length, trg, root);
|
||||
Bry_bfr rslt_bfr = ctx.App().Utl_bry_bfr_mkr().Get_m001();
|
||||
ctx.Tmpl_output_(rslt_bfr);
|
||||
rslt_bfr.Reset_if_gt(Io_mgr.Len_mb);
|
||||
Write_tkn(ctx, src, src.length, rslt_bfr, root);
|
||||
ctx.Tmpl_output_(null);
|
||||
return trg.Mkr_rls().XtoAryAndClear();
|
||||
return rslt_bfr.Mkr_rls().XtoAryAndClear();
|
||||
}
|
||||
private void Write_tkn(Xop_ctx ctx, byte[] src, int src_len, Bry_bfr trg, Xop_tkn_itm tkn) {
|
||||
private void Write_tkn(Xop_ctx ctx, byte[] src, int src_len, Bry_bfr rslt_bfr, Xop_tkn_itm tkn) {
|
||||
switch (tkn.Tkn_tid()) {
|
||||
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);
|
||||
if (!sub_tkn.Ignore())
|
||||
Write_tkn(ctx, src, src_len, trg, sub_tkn);
|
||||
Write_tkn(ctx, src, src_len, rslt_bfr, sub_tkn);
|
||||
}
|
||||
break;
|
||||
case Xop_tkn_itm_.Tid_bry:
|
||||
Xop_bry_tkn bry = (Xop_bry_tkn)tkn;
|
||||
trg.Add(bry.Val());
|
||||
rslt_bfr.Add(bry.Val());
|
||||
break;
|
||||
case Xop_tkn_itm_.Tid_space:
|
||||
if (tkn.Tkn_immutable())
|
||||
trg.Add_byte(Byte_ascii.Space);
|
||||
rslt_bfr.Add_byte(Byte_ascii.Space);
|
||||
else
|
||||
trg.Add_byte_repeat(Byte_ascii.Space, tkn.Src_end() - tkn.Src_bgn());
|
||||
rslt_bfr.Add_byte_repeat(Byte_ascii.Space, tkn.Src_end() - tkn.Src_bgn());
|
||||
break;
|
||||
case Xop_tkn_itm_.Tid_xnde:
|
||||
Xop_xnde_tkn xnde = (Xop_xnde_tkn)tkn;
|
||||
@@ -55,43 +55,45 @@ public class Xot_tmpl_wtr {
|
||||
ctx.Only_include_evaluate_(true);
|
||||
xnde.Tmpl_evaluate(ctx, src, Xot_invk_temp.PageIsCaller, tmp_bfr);
|
||||
ctx.Only_include_evaluate_(false);
|
||||
trg.Add_bfr(tmp_bfr);
|
||||
rslt_bfr.Add_bfr_and_preserve(tmp_bfr);
|
||||
break;
|
||||
}
|
||||
case Xop_xnde_tag_.Tid_includeonly: // noop; DATE:2014-02-12
|
||||
break;
|
||||
case Xop_xnde_tag_.Tid_nowiki: {
|
||||
if (xnde.Tag_close_bgn() == Int_.MinValue)
|
||||
trg.Add_mid(src, tkn.Src_bgn(), tkn.Src_end()); // write src from bgn/end
|
||||
rslt_bfr.Add_mid(src, tkn.Src_bgn(), tkn.Src_end()); // write src from bgn/end
|
||||
else { // NOTE: if nowiki then "deactivate" all xndes by swapping out < for < nowiki_xnde_frag; DATE:2013-01-27
|
||||
Bry_bfr tmp_bfr = ctx.Wiki().App().Utl_bry_bfr_mkr().Get_k004();
|
||||
Nowiki_escape(tmp_bfr, src, xnde.Tag_open_end(), xnde.Tag_close_bgn());
|
||||
trg.Add_bfr_and_clear(tmp_bfr.Mkr_rls());
|
||||
int nowiki_content_bgn = xnde.Tag_open_end(), nowiki_content_end = xnde.Tag_close_bgn();
|
||||
boolean escaped = gplx.xowa.parsers.tmpls.Nowiki_escape_itm.Escape(tmp_bfr, src, nowiki_content_bgn, nowiki_content_end);
|
||||
rslt_bfr.Add_bfr_or_mid(escaped, tmp_bfr, src, nowiki_content_bgn, nowiki_content_end);
|
||||
tmp_bfr.Mkr_rls();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Xop_xnde_tag_.Tid_xowa_cmd:
|
||||
gplx.xowa.xtns.xowa_cmds.Xop_xowa_cmd xowa_cmd = (gplx.xowa.xtns.xowa_cmds.Xop_xowa_cmd)xnde.Xnde_xtn();
|
||||
trg.Add(xowa_cmd.Xtn_html());
|
||||
rslt_bfr.Add(xowa_cmd.Xtn_html());
|
||||
break;
|
||||
default:
|
||||
trg.Add_mid(src, tkn.Src_bgn(), tkn.Src_end()); // write src from bgn/end
|
||||
rslt_bfr.Add_mid(src, tkn.Src_bgn(), tkn.Src_end()); // write src from bgn/end
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
trg.Add_mid(src, tkn.Src_bgn(), tkn.Src_end()); break; // write src from bgn/end
|
||||
rslt_bfr.Add_mid(src, tkn.Src_bgn(), tkn.Src_end()); break; // write src from bgn/end
|
||||
case Xop_tkn_itm_.Tid_ignore: break; // hide comments and <*include*> ndes
|
||||
case Xop_tkn_itm_.Tid_tmpl_prm:
|
||||
tkn.Tmpl_evaluate(ctx, src, Xot_invk_temp.PageIsCaller.Src_(src), trg);
|
||||
tkn.Tmpl_evaluate(ctx, src, Xot_invk_temp.PageIsCaller.Src_(src), rslt_bfr);
|
||||
break;
|
||||
case Xop_tkn_itm_.Tid_tvar:
|
||||
gplx.xowa.xtns.translates.Xop_tvar_tkn tvar_tkn = (gplx.xowa.xtns.translates.Xop_tvar_tkn)tkn;
|
||||
trg.Add(tvar_tkn.Wikitext());
|
||||
rslt_bfr.Add(tvar_tkn.Wikitext());
|
||||
break;
|
||||
case Xop_tkn_itm_.Tid_tmpl_invk:
|
||||
try {
|
||||
tkn.Tmpl_evaluate(ctx, src, Xot_invk_temp.PageIsCaller.Src_(src), trg);
|
||||
tkn.Tmpl_evaluate(ctx, src, Xot_invk_temp.PageIsCaller.Src_(src), rslt_bfr);
|
||||
}
|
||||
catch (Exception exc) {
|
||||
Err_string = String_.new_utf8_(src, tkn.Src_bgn(), tkn.Src_end()) + "|" + ClassAdp_.NameOf_obj(exc) + "|" + Err_.Message_lang(exc);
|
||||
@@ -105,21 +107,4 @@ public class Xot_tmpl_wtr {
|
||||
}
|
||||
public static String Err_string = "";
|
||||
public static final Xot_tmpl_wtr _ = new Xot_tmpl_wtr(); Xot_tmpl_wtr() {}
|
||||
private static void Nowiki_escape(Bry_bfr bfr, byte[] src, int bgn, int end) {
|
||||
for (int i = bgn; i < end; i++) {
|
||||
byte b = src[i];
|
||||
Object o = nowiki_trie.Match(b, src, i, end);
|
||||
if (o == null)
|
||||
bfr.Add_byte(b);
|
||||
else {
|
||||
byte[] bry = (byte[])o;
|
||||
bfr.Add(bry);
|
||||
// NOTE: do not set i, since all keys are len=1 (< and [)
|
||||
}
|
||||
}
|
||||
}
|
||||
private static final ByteTrieMgr_slim nowiki_trie = ByteTrieMgr_slim.cs_().Add(Xop_xnde_wkr.Bry_lt, Xop_xnde_wkr.Bry_escape_lt)
|
||||
.Add(Xop_xnde_wkr.Bry_brack_bgn, Xop_xnde_wkr.Bry_escape_brack_bgn).Add(Xop_xnde_wkr.Bry_pipe, Bry_.new_utf8_("|")).Add(Xop_xnde_wkr.Bry_apos, Bry_.new_utf8_("'"))
|
||||
.Add(":", Bry_.new_utf8_(":")).Add("_", Bry_.new_utf8_("_")).Add("*", Bry_.new_utf8_("*")).Add(" ", Bry_.new_utf8_(" "))
|
||||
;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user