UNPKG

@thi.ng/text-canvas

Version:

Text based canvas, drawing, plotting, tables with arbitrary formatting (incl. ANSI/HTML)

53 lines (52 loc) 2.09 kB
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 };