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-09-28 23:43:46 -04:00
parent 314de43d76
commit 81c8e2554c
117 changed files with 3079 additions and 2223 deletions

View File

@@ -25,6 +25,7 @@ public interface Arg_itm_tkn extends Xop_tkn_itm {
byte[] Dat_ary();
Arg_itm_tkn Dat_ary_(byte[] dat_ary);
byte[] Dat_to_bry(byte[] src);
boolean Dat_ary_had_subst(); void Dat_ary_had_subst_y_();
byte Itm_static(); Arg_itm_tkn Itm_static_(boolean v);
Arg_itm_tkn Subs_add_ary(Xop_tkn_itm... ary);
}
@@ -35,6 +36,7 @@ class Arg_itm_tkn_null extends Xop_tkn_null implements Arg_itm_tkn { public int
public byte[] Dat_ary() {return Bry_.Empty;} public Arg_itm_tkn Dat_ary_(byte[] dat_ary) {return this;}
public byte[] Dat_to_bry(byte[] src) {return Bry_.Empty;}
public Arg_itm_tkn Subs_add_ary(Xop_tkn_itm... ary) {return this;}
public boolean Dat_ary_had_subst() {return false;} public void Dat_ary_had_subst_y_() {}
public byte Itm_static() {return Bool_.__byte;} public Arg_itm_tkn Itm_static_(boolean v) {return this;}
public static final Arg_itm_tkn_null Null_arg_itm = new Arg_itm_tkn_null(); Arg_itm_tkn_null() {}
}
@@ -48,6 +50,7 @@ class Arg_itm_tkn_base extends Xop_tkn_itm_base implements Arg_itm_tkn {
public byte[] Dat_ary() {return dat_ary;} private byte[] dat_ary = Bry_.Empty;
public Arg_itm_tkn Dat_ary_(byte[] dat_ary) {this.dat_ary = dat_ary; return this;}
public Arg_itm_tkn Dat_rng_(int bgn, int end) {dat_bgn = bgn; dat_end = end; return this;}
public boolean Dat_ary_had_subst() {return dat_ary_had_subst;} public void Dat_ary_had_subst_y_() {dat_ary_had_subst = true;} private boolean dat_ary_had_subst = false;
public Arg_itm_tkn Dat_rng_ary_(byte[] src, int bgn, int end) {
dat_bgn = bgn; dat_end = end;
dat_ary = Bry_.Mid(src, bgn, end);

View File

@@ -56,6 +56,7 @@ class Xot_fmtr_prm implements Xot_fmtr {
--depth;
trg.Add(Xop_curly_end_lxr.Hook);
}
public void Write(byte b) {trg.Add_byte(b);}
public void Reg_arg(Xop_ctx ctx, byte[] src, int arg_idx, Arg_nde_tkn self_tkn) {
self_tkn.Key_tkn().Tmpl_fmt(ctx, src, this);
if (self_tkn.KeyTkn_exists()) {

View File

@@ -51,6 +51,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
byte[] name_ary_orig = Bry_.Empty;
int name_bgn = 0, name_ary_len = 0;
boolean subst_found = false;
boolean name_had_subst = false;
if (defn == Xot_defn_.Null) { // tmpl_name is not exact match; may be dynamic, subst, transclusion, etc..
if (name_key_tkn.Itm_static() == Bool_.N_byte) { // tmpl is dynamic; EX:{{{{{1}}}|a}}
Bry_bfr name_tkn_bfr = Bry_bfr.new_(name_tkn.Src_end() - name_tkn.Src_bgn());
@@ -61,6 +62,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
}
else // tmpl is static; note that dat_ary is still valid but rest of name may not be; EX: {{subst:name{{{1}}}}}
name_ary = Bry_.Mid(src, name_key_tkn.Dat_bgn(), name_key_tkn.Dat_end());
name_had_subst = name_key_tkn.Dat_ary_had_subst();
name_ary_orig = name_ary; // cache name_ary_orig
name_ary_len = name_ary.length;
name_bgn = Bry_finder.Find_fwd_while_not_ws(name_ary, 0, name_ary_len);
@@ -99,28 +101,18 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
int colon_pos = -1;
switch (finder.Tid()) {
case Xot_defn_.Tid_subst: // subst is added verbatim; EX: {{subst:!}} -> {{subst:!}}; logic below is to handle printing of arg which could be standardized if src[] was available for tmpl
// if (ctx.Parse_tid() == Xop_parser_.Parse_tid_tmpl) {
bfr.Add(Xop_curly_bgn_lxr.Hook).Add(name_ary);
for (int i = 0; i < args_len; i++) {
Arg_nde_tkn nde = args[i];
bfr.Add_byte(Byte_ascii.Pipe);
nde.Tmpl_fmt(ctx, src, Xot_fmtr_prm._);
}
Xot_fmtr_prm._.Print(bfr);
bfr.Add(Xop_curly_end_lxr.Hook);
return true; // NOTE: nothing else to do; return
// }
// else {
// name_ary = Bry_.Mid(name_ary, finder.Subst_end(), name_ary_len); // chop off "safesubst:"
// name_ary_len = name_ary.length;
// if (defn != Xot_defn_.Null) { // func found
// if (finder.Colon_pos() != -1) colon_pos = finder.Func().Name().length; // set colon_pos; SEE NOTE_1
// }
// subst_found = true;
// }
// break;
bfr.Add(Xop_curly_bgn_lxr.Hook).Add(name_ary);
for (int i = 0; i < args_len; i++) {
Arg_nde_tkn nde = args[i];
// bfr.Add_byte(Byte_ascii.Pipe);
Xot_fmtr_prm._.Write(Byte_ascii.Pipe);
nde.Tmpl_fmt(ctx, src, Xot_fmtr_prm._);
}
Xot_fmtr_prm._.Print(bfr);
bfr.Add(Xop_curly_end_lxr.Hook);
return true; // NOTE: nothing else to do; return
case Xot_defn_.Tid_safesubst:
name_ary = Bry_.Mid(name_ary, finder.Subst_end(), name_ary_len); // chop off "safesubst:"
name_ary = Bry_.Mid(name_ary, finder.Subst_end(), name_ary_len); // chop off "safesubst:"
name_ary_len = name_ary.length;
if (defn != Xot_defn_.Null) { // func found
if (finder.Colon_pos() != -1) colon_pos = finder.Func().Name().length; // set colon_pos; SEE NOTE_1
@@ -270,6 +262,10 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
else {
rv = defn_tmpl.Tmpl_evaluate(ctx, invk_tmpl, rslt_bfr);
prepend_mgr.End(ctx, bfr, rslt_bfr.Bfr(), rslt_bfr.Len(), Bool_.Y);
if (name_had_subst) { // current invk had "subst:"; parse incoming invk again to remove effects of subst; PAGE:pt.w:Argentina DATE:2014-09-24
byte[] tmp_src = rslt_bfr.XtoAryAndClear();
rslt_bfr.Add(wiki.Parser().Parse_text_to_wtxt(tmp_src)); // this could be cleaner / more optimized
}
if (Cache_enabled) {
byte[] rslt_val = rslt_bfr.XtoAryAndClear();
bfr.Add(rslt_val);

View File

@@ -74,8 +74,10 @@ public class Xot_invk_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
if ((ctx.Parse_tid() == Xop_parser_.Parse_tid_tmpl && finder_typeId == Xot_defn_.Tid_subst) // NOTE: if subst, but in tmpl stage, do not actually subst; PAGE:en.w:Unreferenced; DATE:2013-01-31
|| ctx.Cur_page().Ttl().Ns().Id_tmpl()) { // also, if on tmpl page, never evaluate (questionable, but seems to be needed)
}
else
else {
key_tkn.Dat_rng_ary_(src, subst_end, txt_end); // redo txt_rng to ignore subst
key_tkn.Dat_ary_had_subst_y_();
}
if (finder_func != Xot_defn_.Null) {
colon_pos = finder.Colon_pos();
txt_bgn = subst_end;