/
ColdCore-3.0a8/
ColdCore-3.0a8/src/
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");
};