/
ColdCore-3.0a9.02/
ColdCore-3.0a9.02/src/
new object $ansi_format: $plain_format;

var $ansi_format bcolors = #[["black", "40"], ["red", "41"], ["green", "42"], ["yellow", "43"], ["blue", "44"], ["magenta", "45"], ["cyan", "46"], ["white", "47"]];
var $ansi_format colors = #[["black", "30"], ["red", "31"], ["green", "32"], ["yellow", "33"], ["blue", "34"], ["magenta", "35"], ["cyan", "36"], ["white", "37"]];
var $dmi_data descriptions = #[];
var $root created_on = 863402529;
var $root flags = ['variables, 'methods, 'code, 'core];
var $root inited = 1;
var $root managed = [$ansi_format];
var $root manager = $ansi_format;

public method .do_detail() {
    arg vars, flags, args;
    
    return [("\A1;4m" + (flags.getkey("name"))) + "\A0m", vars];
};

public method .do_font() {
    arg vars, flags, args;
    var color, bcolor, code, nested, current;
    
    // allow other .do_* methods to call this with a specific code
    if (dict_contains(vars, 'ansi_code)) {
        code = vars['ansi_code];
        vars = dict_del(vars, 'ansi_code);
    } else {
        color = (| flags.getkey("color") |);
        bcolor = (| flags.getkey("bcolor") |);
        code = (color ? (| ($cml_color.get_color(color))[2] |) : "") || "";
        code += (bcolor ? (code ? (| ";" + (($cml_color.get_color(bcolor))[3]) |) : (| ($cml_color.get_color(bcolor))[3] |)) : "") || "";
    }
    if (code) {
        code = ("\A" + code) + "m";
    
        // handle existing nesting
        if (dict_contains(vars, 'ansi_color)) {
            current = vars['ansi_color];
            nested++;
        }
        vars = dict_add(vars, 'ansi_color, code);
    }
    [args, vars] = ._eval_ctext(args, vars);
    if (code) {
        if (nested) {
            args = ((("\A0m" + code) + args) + "\A0m") + current;
            vars = dict_add(vars, 'ansi_color, current);
        } else {
            args = (code + args) + "\A0m";
            vars = dict_del(vars, 'ansi_color);
        }
    }
    return [args, vars];
};

public method .do_link() {
    arg vars, flags, args;
    
    vars = dict_add(vars, 'ansi_code, "1;4");
    return .do_font(vars, flags, args);
};

public method .explode_ansi() {
    arg line;
    var m, out;
    
    out = [];
    while (line) {
        if ((m = match_regexp(line, "\\\A[^a-z]+[a-z]"))) {
            m = m[1];
            out += [substr(line, 1, (m[1]) - 1), substr(line, m[1], m[2])];
            line = substr(line, (m[1]) + (m[2]));
        } else {
            out += [line];
            break;
        }
    }
    return out;
};

public method .format() {
    arg data, vars;
    var str, len, line, out;
    
    str = (> (._eval_ctext(data, vars))[1] <);
    if ((strlen(str) < 2) || (substr(str, strlen(str) - 1) != "\n"))
        str += "\n";
    
    // ugly and inneficient--use a client people
    out = str_to_buf(str);
    out = out.bufsub(`[92, 65], `[27, 91]);
    return out;
};

public method .hold_rewrap_lines() {
    arg vars, str, prefix;
    var s, p, n, firstline;
    
    s = [];
    n = (vars['width]) + (prefix.length());
    for str in (str.explode("\n", 1))
        s += .wrap_lines(str, n, prefix, 1);
    return s.join("\n");
};

public method .hold_wrap_lines() {
    arg str, len, @stuff;
    var prefix, firstline, split_str, ansi_parts, output, plen, hide_len, x, tlen, cutoff, tstr;
    
    // takes string and wraps it by words, compared to length, returns a list. 
    [(prefix ?= ""), (firstline ?= 0)] = stuff;
    split_str = .explode_ansi(str);
    str = "";
    x = 1;
    tlen = 1;
    ansi_parts = [];
    while (x < (split_str.length())) {
        str += split_str[x];
        ansi_parts = ansi_parts.add([tlen, split_str[x + 1]]);
        tlen += strlen(str);
        x += 2;
    }
    if (firstline)
        str = prefix + str;
    output = [];
    plen = strlen(prefix);
    while (strlen(str) > len) {
        cutoff = stridx(substr(str, 1, len), " ", -1);
        if (cutoff <= plen) {
            tstr = substr(str, 1, len);
            str = prefix + substr(str, len + 1);
        } else {
            tstr = substr(str, 1, cutoff - 1);
            str = prefix + substr(str, cutoff + 1);
        }
        output += tstr;
    }
    return output + [str];
};