/
ColdCore-3.0a9.02/
ColdCore-3.0a9.02/src/
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);
};