1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00
This commit is contained in:
gnosygnu
2014-07-06 22:58:35 -04:00
parent 57f65b4d0c
commit ecbe2918d8
187 changed files with 4184 additions and 2286 deletions

View File

@@ -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;

View File

@@ -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;
}
}
}
}

View File

@@ -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;}

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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 &lt; 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_("&#x7c;")).Add(Xop_xnde_wkr.Bry_apos, Bry_.new_utf8_("&apos;"))
.Add(":", Bry_.new_utf8_("&#x3A;")).Add("_", Bry_.new_utf8_("&#95;")).Add("*", Bry_.new_utf8_("&#42;")).Add(" ", Bry_.new_utf8_("&#32;"))
;
}