new object $formatter: $evaluator; var $root created_on = 837583776; var $root flags = ['variables, 'methods, 'code, 'core]; var $root inited = 1; var $root managed = [$formatter]; var $root manager = $formatter; public method ._eval_ctext() { arg data, vars; var out, uflags, token; out = ""; if (type(data) != 'list) data = [data]; for token in (data) { refresh(); switch (type(token)) { case 'frob: switch (class(token)) { case $generator: [token, vars] = ((| vars['evaluator] |) || $bs_eval).eval_generator(token, vars); if (type(token) == 'string) { out += token; } else { [token, vars] = ._eval_ctext(token, vars); out += token; } case $format: [token, vars] = .eval_formatter(token, vars); out += token; } case 'string: out += token; case 'list: [token, vars] = ._eval_ctext(token, vars); out += token; default: out += token; } } return [out, vars]; }; public method .do_invoke() { arg vars, flags, args; [args, vars] = ._eval_ctext(args, vars); return [args, vars]; }; public method .do_obj() { arg vars, flags, args; return [flags.getkey("name"), vars]; }; public method .do_sense() { arg vars, flags, args; return [(| tostr(vars[tosym(args[1])]) |) || "", vars]; }; public method .do_switch() { arg vars, flags, args; var v, i, num, n, done; v = flags.getkey("value"); if (type(v) == 'list) v = v.join(""); if (type(args) == 'list) args = args[1]; 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 .eval_formatter() { arg form, vars; var flags, i, text; form = form.eval_flags(vars); catch ~methodnf { return .(form[4])(vars, form[2], form[3]); } with { [text, vars] = ._eval_ctext(form[3], vars); if ((vars['time]) == 'post) return [text, vars]; form = (<$format, [form[1], form[2], text, form[4]]>); return [[form], vars]; } }; public method .eval_generator() { arg gen, vars; return (vars['evaluator]).eval_generator(gen, vars); };