new object $uncompiler: $evaluator;
var $root created_on = 837583986;
var $root flags = ['variables, 'methods, 'code, 'core];
var $root inited = 1;
var $root managed = [$uncompiler];
var $root manager = $uncompiler;
public method ._eval_ctext() {
arg data, vars, @quote_all;
var out, uflags, token, prev, next, t;
out = [];
if (type(data) != 'list)
data = [data];
prev = 0;
token = 0;
for next in (data + [0]) {
t = token;
switch (type(token)) {
case 'integer:
case 'frob:
if (class(token) == $generator) {
[token, vars] = (> .eval_generator(token, vars) <);
out = out.affix(token);
} else if (class(token) == $format) {
[token, vars] = (> .eval_formatter(token, vars) <);
out = out.affix(token);
}
case 'string:
token = quote_all ? (.quote_all(token)) : (.quote(token));
token = ._spaces(token, prev, 'prev);
token = ._spaces(token, next, 'next);
out = out.affix(token);
default:
out = out.affix(toliteral(token));
}
prev = t;
token = next;
}
return [out, vars];
};
public method ._spaces() {
arg token, other, dir;
var m, i;
if ((type(other) == 'frob) && ((other.name()) in ($compiler.glue_table()))) {
if (dir == 'prev) {
m = ((token.regexp("^ *"))[1]).length();
return ("".pad(m * 2, "\ ")) + (token.subrange(m + 1));
} else {
m = ((token.regexp(" *$"))[1]).length();
return (token.subrange(1, (token.length()) - m)) + ("".pad(m * 2, "\ "));
}
}
return token;
};
public method .do_br() {
arg vars, flags, args;
return [["", "{br}"], vars];
};
public method .do_dd() {
arg vars, flags, args;
var token;
[args, vars] = ._eval_ctext(args, vars);
return [(["", "{dd: "].affix(args)).affix("}"), vars];
};
public method .do_detail() {
arg vars, flags, args;
return .eval_formatter((<$format, ["detail", flags, (| (vars['details])[flags.getkey("name")] |) || ["UNKNOWN"], 'DO_NOT_CALL_THIS]>), vars);
};
public method .do_dfn() {
arg vars, flags, args;
var nobound, ind, dfn;
ind = (| flags.getkey("ind") |) || 8;
nobound = (| flags.getkey("nobound") |);
dfn = "{dfn";
if (nobound)
dfn += " nobound";
if (ind && (ind != 8))
dfn += " ind=" + ind;
[args, vars] = ._eval_ctext(args, vars);
if (nobound)
return [(["", (" " + dfn) + ":"].affix(args)).affix(["}"]), vars];
return [(["", "", (" " + dfn) + ":"].affix(args)).affix(["}"]), vars];
};
public method .do_dl() {
arg vars, flags, args;
var dl, token;
if ((| flags.getkey("columned") |))
dl = "{dl columned";
else
dl = "{dl";
if ((| flags.getkey("ind") |))
dl += " ind=" + (flags.getkey("ind"));
dl += ":";
[args, vars] = ._eval_ctext(args, vars);
return [((["", dl].affix(args.prefix(" "))).affix("}")) + [""], vars];
};
public method .do_dt() {
arg vars, flags, args;
var dl, token;
[args, vars] = ._eval_ctext(args, vars);
return [(["", "{dt: "].affix(args)).affix("}"), vars];
};
public method .do_lh() {
arg vars, flags, args;
[args, vars] = ._eval_ctext(args, vars);
return [(["", "{lh:"].affix(args)).affix("}"), vars];
};
public method .do_li() {
arg vars, flags, args;
[args, vars] = ._eval_ctext(args, vars);
return [(["", "{li:"].affix(args)).affix("}"), vars];
};
public method .do_np() {
arg vars, flags, args;
return [["", "", "{np}"], vars];
};
public method .do_p() {
arg vars, flags, args;
return [["", "{p}"], vars];
};
public method .do_quote() {
arg vars, flags, args;
return [(["{quote "].affix((args[1]).explode("\n", 1))).affix("}"), vars];
};
public method .do_subj() {
arg vars, flags, args;
var out, word, l;
[args, vars] = ._eval_ctext(args, vars);
l = toint((| flags.getkey("level") |) || "4");
return [(["", "", ("{subj level=" + l) + ":"].affix(args)).affix(["}"]), vars];
};
public method .do_switch() {
arg vars, flags, args;
var i, j, out, def, ret, val, l, lower, upper, val;
def = [""];
[val, vars] = ._eval_ctext(flags.getkey("value"), vars);
out = [""];
for i in (args) {
[ret, vars] = ._eval_ctext(i[2], vars);
if ((i[1]) == 'default) {
def = ["", "[default]", ""].affix(ret.prefix(" "));
} else if ((i[1]) == 'ranges) {
for j in (i[2]) {
[lower, upper, ret] = j;
[ret, vars] = ._eval_ctext(ret, vars);
out = (out.affix(["", ((("[range:" + lower) + "..") + upper) + "]", ""])).affix(ret.prefix(" "));
}
} else {
out = (out.affix(["", ("[case:" + (i[1])) + "]", ""])).affix(ret.prefix(" "));
}
}
return [(((["", "{switch value="].affix(val)).affix(":")).affix((out.affix(def)).prefix(" "))).affix(["}", ""]), vars];
};
public method .do_td() {
arg vars, flags, args;
var opts, value;
if ((value = (| toint(flags.getkey("rowspan")) |)))
opts = " rowspan=" + value;
else
opts = "";
if ((value = (| toint(flags.getkey("colspan")) |)))
opts += " colspan=" + value;
[args, vars] = ._eval_ctext(args, vars);
return [(["", (" {td" + opts) + ":"].affix(args)).affix("}"), vars];
};
public method .do_th() {
arg vars, flags, args;
var opts, value;
if ((value = (| toint(flags.getkey("rowspan")) |)))
opts = " rowspan=" + value;
else
opts = "";
if ((value = (| toint(flags.getkey("colspan")) |)))
opts += " colspan=" + value;
[args, vars] = ._eval_ctext(args, vars);
return [(["", (" {th" + opts) + ":"].affix(args)).affix("}"), vars];
};
public method .do_tr() {
arg vars, flags, args;
[args, vars] = ._eval_ctext(args, vars);
return [(["", "{tr:"].affix(args)).affix("}"), vars];
};
public method .do_ul() {
arg vars, flags, args;
[args, vars] = ._eval_ctext(args, vars);
return [((["", "{ul:"].affix(args.prefix(" "))).affix("}")) + [""], vars];
};
public method .eval_formatter() {
arg gen, vars;
var out, flags, key, value, text;
catch ~methodnf {
return .(gen.method())(vars, gen.ctext_flags(), gen.args());
} with {
out = ["{" + (gen.name())];
flags = gen.ctext_flags();
for key in (flags) {
if ((key[2]) == 1) {
out = out.affix(" " + (key[1]));
} else {
[text, vars] = ._eval_ctext(key[2], vars, 1);
out = (out.affix((" " + (key[1])) + "=")).affix(text);
}
}
if (gen.args()) {
out = out.affix(":");
for key in (gen.args()) {
[text, vars] = ._eval_ctext([key], vars);
out = out.affix(text);
}
}
out = out.affix("}");
return [out, vars];
}
};
public method .eval_generator() {
arg gen, vars;
var out, flags, key, value, text;
catch ~methodnf {
return .(gen.method())(vars, gen.ctext_flags(), gen.args());
} with {
out = ["[" + (gen.name())];
flags = gen.ctext_flags();
for key in (flags) {
if ((key[2]) == 1) {
out = out.affix(" " + (key[1]));
} else {
[text, vars] = (> ._eval_ctext([key[2]], vars, 1) <);
out = (out.affix((" " + (key[1])) + "=")).affix(text);
}
}
if (gen.args()) {
out = out.affix(":");
for key in (gen.args()) {
[text, vars] = (> ._eval_ctext([key], vars) <);
out = out.affix(text);
}
}
return [out.affix("]"), vars];
}
};
public method .gen_switch() {
arg vars, flags, args;
var i, j, out, def, ret, val, l, lower, upper, val;
def = [""];
[val, vars] = ._eval_ctext(flags.getkey("value"), vars);
out = [""];
for i in (args) {
[ret, vars] = ._eval_ctext(i[2], vars);
if ((i[1]) == 'default) {
def = ["", "[default]", ""].affix(ret.prefix(" "));
} else if ((i[1]) == 'ranges) {
for j in (i[2]) {
[lower, upper, ret] = j;
[ret, vars] = ._eval_ctext(ret, vars);
out = (out.affix(["", ((("[range:" + lower) + "..") + upper) + "]", ""])).affix(ret.prefix(" "));
}
} else {
out = (out.affix(["", ("[case:" + (i[1])) + "]", ""])).affix(ret.prefix(" "));
}
}
return [(((["", "[switch value="].affix(val)).affix(":")).affix((out.affix(def)).prefix(" "))).affix(["]", ""]), vars];
};
public method .quote() {
arg s;
return s.sed("([][{}\])", "\%1", "g");
};
public method .quote_all() {
arg s;
return s.sed("([][{}\:= ])", "\%1", "g");
};