mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
v1.9.5.1
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user