new object $bs_eval: $evaluator;
var $root created_on = 837583704;
var $root flags = ['variables, 'methods, 'code, 'core];
var $root inited = 1;
var $root managed = [$bs_eval];
var $root manager = $bs_eval;
public method ._separate_list() {
arg sep, l;
if (sep == "none")
return l;
if (sep == "english")
return [l.to_english()];
return [l.join(sep)];
};
public method .eval_formatter() {
arg form, vars;
var text;
if ((vars['time]) == 'post) {
[text, vars] = (vars['formatter]).eval_formatter(form, vars);
return [[text], vars];
}
return pass(form, vars);
};
public method .gen_data() {
arg vars, flags, args;
var method, data;
[args, vars] = ._eval_ctext(args, vars);
method = (| flags.getkey("source") |);
catch ~methodnf
data = (vars['this]).(tosym("gen_" + method))();
with
return [[">>>invalid data source<<<"], vars];
return [[data], vars];
};
public method .gen_def() {
arg vars, flags, args;
var name, val;
name = flags.getkey("var");
val = args[1];
return [[""], vars.add(name, val)];
};
public method .gen_english() {
arg vars, flags, args;
var sep, empty, and, text, item;
sep = (| flags.getkey("separator") |) || ", ";
empty = (| flags.getkey("empty") |) || "nothing";
and = (| flags.getkey("and") |) || " and ";
[text, vars] = ._eval_ctext(args, vars);
if (((vars['time]) == 'pre) || find item in (text) where (type(item) == 'frob)) {
return [[(<$generator, ["english", flags, text, 'gen_english]>)], vars];
} else {
if (type(sep) == 'list)
sep = sep[1];
if (type(and) == 'list)
and = and[1];
return [[text.to_english(empty, and, sep)], vars];
}
};
public method .gen_foreach() {
arg vars, flags, args;
var v, list, body, out, item, sep, text;
v = (| flags.getkey("var") |) || "iterator";
list = flags.getkey("list");
sep = (| flags.getkey("separator") |) || " ";
out = [];
for item in (list) {
vars = vars.add(v, item);
[text, vars] = ._eval_ctext(args, vars);
if ((vars['time]) == 'post)
out = out.affix(text);
else
out += [text];
}
if ((vars['time]) == 'pre)
out = ._separate_list(sep, out);
return [out, vars];
};
public method .gen_join() {
arg vars, flags, args;
var v, sep, item;
sep = (| flags.getkey("separator") |) || " ";
[args, vars] = ._eval_ctext(args, vars);
if (((vars['time]) == 'pre) || find item in (args) where (type(item) == 'frob)) {
return [[(<$generator, ["join", flags, args, 'gen_join]>)], vars];
} else {
if (type(sep) == 'list)
sep = sep[1];
return [._separate_list(sep, args), vars];
}
};
public method .gen_name() {
arg vars, flags, args;
var out, name, sep, type;
[args, vars] = ._eval_ctext(args, vars);
out = [];
type = (| tosym(flags.getkey("type")) |) || 'name;
if (!args)
return [[(vars['this]).namef(type)], vars];
sep = (| flags.getkey("separator") |) || " ";
for name in (args) {
switch (type(name)) {
case 'objnum:
name = name.namef(type);
case 'string:
catch ~objnf
name = ((vars['this]).match_environment(name)).namef(type);
with
name = name;
}
out += [name];
}
return [._separate_list(sep, out), vars];
};
public method .gen_pro() {
arg vars, flags, args;
var out, type, obj, key, objstr;
if ((| (objstr = flags.getkey("obj")) |)) {
while (type(objstr) == 'list)
objstr = objstr[1];
if (type(objstr) == 'string) {
catch ~objnf, ~namenf
obj = (vars['this]).match_environment(objstr);
with
return [[(">>ERROR: Invalid object '" + objstr) + "'.<<"], vars];
} else {
obj = objstr;
}
} else {
obj = vars['this];
}
out = [];
if ((args.length()) == 0)
return [[">>ERROR: Must specify pronoun type.<<"], vars];
type = (args[1]).to_symbol();
catch ~keynf
out = (> [(obj.gender()).pronoun(type)] <);
with
return [[(">>ERROR: Invalid pronoun type '" + (args[1])) + "'.<<"], vars];
return [out, vars];
};
public method .gen_servername() {
arg vars, flags, args;
return [[$motd.server_name()], vars];
};
public method .gen_servname() {
arg vars, flags, args;
return [[$motd.server_name()], vars];
};
public method .gen_set() {
arg vars, flags, args;
var text, name;
name = flags.getkey("var");
[text, vars] = ._eval_ctext(args[1], vars);
return [[""], vars.add(name, text[1])];
};
public method .gen_switch() {
arg vars, flags, args;
var v, i, num, n, done;
v = flags.getkey("value");
if (type(v) == 'list)
v = v.join("");
if (args.contains(v))
return ._eval_ctext(args[v], vars);
if (args.contains('ranges)) {
if ((num = v.is_numeric()))
n = toint(v);
done = 0;
for i in (args['ranges]) {
if ((| num && (((i[1]).is_numeric()) && ((i[2]).is_numeric())) |)) {
if ((n >= toint(i[1])) && (n <= toint(i[2])))
done = 1;
} else if ((| (v >= (i[1])) && (v <= (i[2])) |)) {
done = 1;
}
if (done)
return ._eval_ctext(i[3], vars);
}
}
if (args.contains('default))
return ._eval_ctext(args['default], vars);
return [((vars['time]) == 'pre) ? [""] : "", vars];
};
public method .gen_time() {
arg vars, flags, args;
var a, word;
[args, vars] = ._eval_ctext(args, vars);
if (!args)
return [[tostr(time())], vars];
return [[$time.format(args[1])], vars];
};
public method .gen_vars() {
arg vars, flags, args;
var out, v, sep;
out = [];
sep = (| flags.getkey("separator") |) || " ";
for v in (vars.keys()) {
if (type(v) == 'string)
out += [v];
}
return [._separate_list(sep, out), vars];
};