new object $plain_format: $formatter;
var $root created_on = 837583858;
var $root flags = ['variables, 'methods, 'code, 'core];
var $root inited = 1;
var $root managed = [$plain_format];
var $root manager = $plain_format;
public method .do_action() {
arg vars, flags, args;
[args, vars] = ._eval_ctext(args[1], vars);
(vars['receiver]).register_action(args, flags.getkey("cmd"));
return [("[" + args) + "]", vars];
};
public method .do_anchor() {
arg vars, flags, args;
[args, vars] = ._eval_ctext(args[1], vars);
return [("/" + args) + "/", vars];
};
public method .do_b() {
arg vars, flags, args;
var out, a;
return ._eval_ctext(args, vars);
};
public method .do_br() {
arg vars, flags, args;
return ["\n", vars];
};
public method .do_columnize() {
arg vars, flags, args;
var cols;
cols = (| flags.getkey("cols") |) || "*";
[args, vars] = ._eval_ctext(args, vars);
return [[(cols == "*") ? (args.lcolumnize()) : (args.columnize(toint(cols)))], vars];
};
public method .do_dd() {
arg vars, flags, args;
return .eval_indented(args, vars, (| vars['dl_ind] |) || 4);
};
public method .do_detail() {
arg vars, flags, args;
return [("[" + (flags.getkey("name"))) + "]", vars];
};
public method .do_dfn() {
arg vars, flags, args;
var ind, nobound;
ind = toint((| flags.getkey("ind") |) || 8);
nobound = (| flags.getkey("nobound") |);
vars = vars.add('header, "");
[args, vars] = .eval_indented(args, vars, ind);
if (nobound)
return ["\n" + args, vars];
return [("\n" + args) + "\n", vars];
};
public method .do_dl() {
arg vars, flags, args;
var out, token, c, cm, ind, mem;
c = (| vars['columned] |) || 0;
cm = (| flags.getkey("columned") |) || 0;
ind = (| toint(flags.getkey("ind")) |) || 4;
vars = vars.add('columned, cm);
if (dict_contains(vars, 'dl_ind))
mem = vars['dl_ind];
vars = dict_add(vars, 'dl_ind, ind);
[args, vars] = ._eval_ctext(args, vars);
if (mem)
vars = dict_add(vars, 'dl_ind, mem);
else
vars = dict_del(vars, 'dl_ind);
if (c)
vars = vars.add('columned, c);
else if (vars.contains('columned))
vars = vars.del('columned);
return [args + "\n", vars];
};
public method .do_dt() {
arg vars, flags, args;
vars = vars.add('header, "");
[args, vars] = ._eval_ctext(args, vars);
if ((| vars['columned] |))
return ["\n ", vars.add('header, pad(" " + args, 25))];
else
return [("\n " + args) + "\n", vars.add('header, "")];
};
public method .do_em() {
arg vars, flags, args;
var out, a;
return ._eval_ctext(args, vars);
};
public method .do_hr() {
arg vars, flags, args;
if ((| flags.getkey("sep") |))
return ["---\n", vars];
return [pad("\n", vars['width], "-") + "\n", vars];
};
public method .do_i() {
arg vars, flags, args;
var out, a;
return ._eval_ctext(args, vars);
};
public method .do_img() {
arg vars, flags, args;
var alt;
alt = (| flags.getkey("plain") |) || "";
return [alt, vars];
};
public method .do_lh() {
arg vars, flags, args;
var line, oheader;
oheader = (| vars['header] |);
vars = dict_add(vars, 'header, "");
[args, vars] = .eval_indented(args, vars, 2);
if (oheader == ~keynf)
vars = dict_del(vars, 'header);
else
vars = dict_add(vars, 'header, oheader);
return [args + "\n", vars];
};
public method .do_li() {
arg vars, flags, args;
var line, type, num, depth, oheader;
type = (| vars['list_type] |) || 'plain;
depth = (| vars['list_depth] |) || 1;
oheader = (| vars['header] |);
if (type == 'plain) {
if (depth % 2)
vars = dict_add(vars, 'header, "* ");
else
vars = dict_add(vars, 'header, "+ ");
} else {
num = (vars['list_last]) + 1;
vars = dict_add(vars, 'header, num + ") ");
vars = dict_add(vars, 'list_last, num);
}
depth *= 2;
[args, vars] = .eval_indented(args, vars, depth);
if (oheader == ~keynf)
vars = dict_del(vars, 'header);
else
vars = dict_add(vars, 'header, oheader);
return ["\n" + args, vars];
};
public method .do_link() {
arg vars, flags, args;
[args, vars] = ._eval_ctext(args[1], vars);
return [("[" + args) + "]", vars];
};
public method .do_np() {
arg vars, flags, args;
return ["\n\n", vars];
};
public method .do_ol() {
arg vars, flags, args;
var out, token, old, last, depth;
if (dict_contains(vars, 'list_type)) {
old = vars['list_type];
if (old == 'ordinal)
last = vars['list_last];
else
last = -1;
vars = dict_add(vars, 'list_depth, (vars['list_depth]) + 1);
} else {
vars = dict_add(vars, 'list_depth, 1);
}
vars = dict_add(vars, 'list_type, 'ordinal);
vars = dict_add(vars, 'list_last, 0);
[args, vars] = ._eval_ctext(args, vars);
if (old) {
vars = dict_add(vars, 'list_type, old);
if ((old == 'ordinal) && (last != (-1)))
vars = dict_add(vars, 'list_last, last);
vars = dict_add(vars, 'list_depth, (vars['list_depth]) - 1);
} else {
vars = dict_del(vars, 'list_type);
if (dict_contains(vars, 'list_last))
vars = dict_del(vars, 'list_last);
vars = dict_del(vars, 'list_depth);
}
return [args, vars];
};
public method .do_p() {
arg vars, flags, args;
return ["\n", vars];
};
public method .do_quote() {
arg vars, flags, args;
return [args[1], vars];
};
public method .do_subj() {
arg vars, flags, args;
var out, word, l, len;
[out, vars] = ._eval_ctext(args, vars);
len = vars['width];
switch (toint((| flags.getkey("level") |) || "4")) {
case 1:
out = ((("\n\n" + out) + "\n") + ("".pad(strlen(out), "="))) + "\n";
case 2:
out = ((("\n\n" + out) + "\n") + ("".pad(strlen(out), "-"))) + "\n";
case 3:
out = ("\n\n" + out) + "\n";
default:
out = ("\n" + out) + "\n";
}
return [out, vars];
};
public method .do_table() {
arg vars, flags, args;
var tblinfo, i, ntbinfo, info, width, l, lr, lc, inds, ind, cwidth;
tblinfo = (| vars['table_info] |) || 0;
width = vars['width];
if (!(| (ntbinfo = flags.getkey("cols")) |))
throw(~flags, "Need column information.");
ind = (| abs(toint(flags.getkey("ind"))) |) || 0;
info = [];
cwidth = width - ind;
if ("%" in ntbinfo) {
for i in (ntbinfo.explode(","))
info += [toint(cwidth * (toint(i) / 100.0))];
} else {
for i in (ntbinfo.explode(","))
info += [toint(i)];
}
vars = #[['table_info, [info, 0]], ['rinfo, $list.make(info.length(), 0)], ['rcont, $list.make(info.length(), [])]].union(vars);
[args, vars] = ._eval_ctext(args, vars);
vars = tblinfo ? (vars.add('table_info, tblinfo)) : (vars.del('table_info));
vars = vars.add('width, width);
return ["\n" + args, vars];
};
public method .do_td() {
arg vars, flags, args;
var tblinfo, rinfo, col, cols, rows, w, n, max;
rows = (| toint(flags.getkey("rowspan")) |) || 1;
cols = (| toint(flags.getkey("colspan")) |) || 1;
rinfo = vars['rinfo];
tblinfo = vars['table_info];
col = (tblinfo[2]) + 1;
n = [];
max = listlen(tblinfo[1]);
while (rinfo[col]) {
col++;
n += [[0, (tblinfo[1])[col], []]];
}
w = ((tblinfo[1]).subrange(col, cols)).sum();
tblinfo = tblinfo.replace(2, (col + cols) - 1);
vars = (vars.add('table_info, tblinfo)).add('header, "");
[args, vars] = .eval_indented(args, vars, 0, w);
return [(n + [[rows, w, args.explode("\n", 1)]]) + ($list.make(cols - 1, [rows, 0, []])), vars];
};
public method .do_th() {
arg vars, flags, args;
var tblinfo, rinfo, col, cols, rows, w, n, max;
rows = (| toint(flags.getkey("rowspan")) |) || 1;
cols = (| toint(flags.getkey("colspan")) |) || 1;
rinfo = vars['rinfo];
tblinfo = vars['table_info];
col = (tblinfo[2]) + 1;
n = [];
max = listlen(tblinfo[1]);
while (rinfo[col]) {
col++;
n += [[0, (tblinfo[1])[col], []]];
}
w = ((tblinfo[1]).subrange(col, cols)).sum();
tblinfo = tblinfo.replace(2, (col + cols) - 1);
vars = (vars.add('table_info, tblinfo)).add('header, "");
[args, vars] = .eval_indented(args, vars, 0, w);
return [(n + [[rows, w, args.explode("\n", 1)]]) + ($list.make(cols - 1, [rows, 0, []])), vars];
};
public method .do_tr() {
arg vars, flags, args;
var tblinfo, rinfo, i, l, len, s, j, col, rcont, done;
tblinfo = vars['table_info];
tblinfo = tblinfo.replace(2, 0);
rinfo = vars['rinfo];
rcont = vars['rcont];
vars = vars.add('table_info, tblinfo);
l = [];
col = 1;
for i in (args) {
if (type(i) != 'frob)
throw(~table, "Only {td} tags permitted in rows");
switch (i.method()) {
case 'do_td:
[i, vars] = .do_td(vars, i.ctext_flags(), i.args());
case 'do_th:
[i, vars] = .do_th(vars, i.ctext_flags(), i.args());
default:
throw(~table, "Only {td} tags permitted in rows");
}
l += i;
for j in (i) {
rcont = rcont.replace(col, (rcont[col]) + (j[3]));
col++;
}
}
l += $list.make((rcont.length()) - (l.length()), [0, 0, []]);
s = "";
i = 1;
done = 0;
rinfo = map j in [1 .. rinfo.length()] to (((rinfo[j]) - 1) + ((l[j])[1]));
while (!done) {
done = 1;
for j in [1 .. rcont.length()] {
s += ((| (rcont[j])[i] |) || "").pad((l[j])[2]);
done = done && ((rinfo[j]) || (i >= listlen(rcont[j])));
}
i++;
s += "\n";
}
for j in [1 .. rinfo.length()]
rcont = rcont.replace(j, (| (rcont[j]).subrange(i) |) || []);
vars = (vars.add('rinfo, rinfo)).add('rcont, rcont);
return [s, vars];
};
public method .do_tt() {
arg vars, flags, args;
var out, a;
return ._eval_ctext(args, vars);
};
public method .do_ul() {
arg vars, flags, args;
var out, token, old, last, depth;
if (dict_contains(vars, 'list_type)) {
old = vars['list_type];
if (old == 'ordinal)
last = vars['list_last];
else
last = -1;
vars = dict_add(vars, 'list_depth, (vars['list_depth]) + 1);
} else {
vars = dict_add(vars, 'list_depth, 1);
}
vars = dict_add(vars, 'list_type, 'plain);
[args, vars] = ._eval_ctext(args, vars);
if (old) {
vars = dict_add(vars, 'list_type, old);
if ((old == 'ordinal) && (last != (-1)))
vars = dict_add(vars, 'list_last, last);
vars = dict_add(vars, 'list_depth, (vars['list_depth]) - 1);
} else {
vars = dict_del(vars, 'list_type);
vars = dict_del(vars, 'list_depth);
}
return [args, vars];
};
public method .do_web() {
arg vars, flags, args;
[args, vars] = ._eval_ctext(args, vars);
return [((((args + "<") + (flags.getkey("name"))) + ":") + (flags.getkey("src"))) + ">", vars];
};
public method .eval_indented() {
arg args, vars, i, @w;
var width, indent;
width = vars['width];
vars = vars.add('width, (| w[1] |) || (width - i));
[args, vars] = ._eval_ctext(args, vars);
return [.rewrap_lines(vars, (vars['header]) + args, pad("", i)), vars.add('width, width)];
};
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";
return str_to_buf(str);
};
public method .init() {
return #[['header, ""], ['width, 78]];
};
public method .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 += str.wrap_lines(n, prefix, 1);
return s.join("\n");
};