1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00

Scribunto: Evaluate template-args when expanding template, not separately afterwards

This commit is contained in:
gnosygnu
2017-09-04 08:30:33 -04:00
parent 9f6ef68bfa
commit b101b356ad
8 changed files with 26 additions and 18 deletions

View File

@@ -56,6 +56,7 @@ public class Xot_invk_mock implements Xot_invk {
public Arg_nde_tkn Args_get_by_key(byte[] src, byte[] key) {return (Arg_nde_tkn)args.Get_by(key);}
public static Xot_invk_mock new_(byte defn_tid, byte[] frame_ttl, Keyval... args) {return new_(defn_tid, 1, frame_ttl, args);}
public static Xot_invk_mock new_(byte[] frame_ttl, Keyval... args) {return new_(Xot_defn_.Tid_null, 1, frame_ttl, args);}
public static Xot_invk_mock preprocess_(byte[] frame_ttl, Keyval... args) {return new_(Xot_defn_.Tid_null, 1, frame_ttl, args);}
public static Xot_invk_mock test_(byte[] frame_ttl, Keyval... args) {return new_(Xot_defn_.Tid_null, 0, frame_ttl, args);}
public static Xot_invk_mock new_(byte defn_tid, int idx_adj, byte[] frame_ttl, Keyval... args) {
Xot_invk_mock rv = new Xot_invk_mock(defn_tid, idx_adj, frame_ttl);

View File

@@ -62,7 +62,9 @@ public class Xot_invk_temp implements Xot_invk {
}
arg_idx_hash.Add_if_dupe_use_nth(Int_obj_ref.New(int_key), arg); // Add_if_dupe_use_nth to keep latest version; needed for {{A|1=a|1=b}} DATE:2014-07-23
}
public static final Xot_invk_temp Page_is_caller = new Xot_invk_temp(true); // SEE NOTE_2
public static final Xot_invk Null_frame = null;
}
/*
NOTE_1:
@@ -81,4 +83,6 @@ TEXT: "a {{{1}}}b c"
Note that in order to resolve mwo_concat we need to pass in an Xot_invk
This Xot_invk is the "Page_is_caller" ref
Note this has no parameters and is always empty
Does this static ref have multi-threaded issues? DATE:2017-09-01
*/

View File

@@ -17,20 +17,20 @@ 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 static byte[] Write_all(Xop_ctx ctx, Xop_root_tkn root, byte[] src) {
public static byte[] Write_all(Xop_ctx ctx, Xot_invk frame, 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);
Write_tkn(bfr, ctx, frame, src, src.length, root);
byte[] rv = bfr.To_bry_and_rls();
return ctx.Wiki().Parser_mgr().Uniq_mgr().Parse(rv); // NOTE: noops if no UNIQs; // UNIQ; DATE:2017-03-31
}
private static 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, Xot_invk frame, byte[] src, int src_len, 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(rslt_bfr, ctx, src, src_len, sub_tkn);
Write_tkn(rslt_bfr, ctx, frame, src, src_len, sub_tkn);
}
break;
case Xop_tkn_itm_.Tid_bry:
@@ -91,7 +91,10 @@ public class Xot_tmpl_wtr {
break;
case Xop_tkn_itm_.Tid_tmpl_invk:
try {
tkn.Tmpl_evaluate(ctx, src, Xot_invk_temp.Page_is_caller.Src_(src), rslt_bfr);
if (frame == Xot_invk_temp.Null_frame) { // NOTE: should probably remove lazy-instantiation and always force frame to be passed in; DATE:2017-09-03
frame = Xot_invk_temp.Page_is_caller.Src_(src);
}
tkn.Tmpl_evaluate(ctx, src, frame, rslt_bfr);
}
catch (Exception e) {
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();