@thi.ng/text-canvas
Version:
Text based canvas, drawing, plotting, tables with arbitrary formatting (incl. ANSI/HTML)
53 lines (52 loc) • 2.09 kB
JavaScript
import { ensureArray } from "@thi.ng/arrays/ensure-array";
import { fitClamped } from "@thi.ng/math/fit";
import { fract } from "@thi.ng/math/prec";
import { padLeft } from "@thi.ng/strings/pad-left";
import { padRight } from "@thi.ng/strings/pad-right";
import { repeat } from "@thi.ng/strings/repeat";
import { map } from "@thi.ng/transducers/map";
import { max as $max } from "@thi.ng/transducers/max";
import { min as $min } from "@thi.ng/transducers/min";
import { BARS_H, BARS_V } from "./api.js";
const barChartVLines = (height, vals, min, max) => {
const $vals = ensureArray(vals);
min = min !== void 0 ? min : $min($vals);
max = max !== void 0 ? max : $max($vals);
const bars = [...map((x) => barVertical(height, x, min, max, ""), $vals)];
const num = bars.length;
const res = [];
for (let i = 0; i < height; i++) {
let line = "";
for (let j = 0; j < num; j++) {
line += bars[j][i];
}
res.push(line);
}
return res;
};
const barChartVStr = (height, vals, min, max) => barChartVLines(height, vals, min, max).join("\n");
const barChartHLines = (width, vals, min, max) => {
const $vals = ensureArray(vals);
min = min !== void 0 ? min : $min($vals);
max = max !== void 0 ? max : $max($vals);
return [...map((x) => barHorizontal(width, x, min, max), $vals)];
};
const barChartHStr = (width, vals, min, max) => barChartHLines(width, vals, min, max).join("\n");
const barHorizontal = (width, x, min = 0, max = 1) => __bar(BARS_H, width, false, x, min, max, "");
const barVertical = (height, x, min = 0, max = 1, delim = "\n") => __bar(BARS_V, height, true, x, min, max, delim);
const __bar = (chars, size, left, x, min, max, delim) => {
x = fitClamped(x, min, max, 0, size);
const f = fract(x) * 9 | 0;
const full = repeat(chars[8] + delim, x | 0);
const partial = f > 0 ? chars[f] + delim : "";
size += size * delim.length;
return left ? padLeft(size, " ")(partial + full) : padRight(size, " ")(full + partial);
};
export {
barChartHLines,
barChartHStr,
barChartVLines,
barChartVStr,
barHorizontal,
barVertical
};