UNPKG

simple-ascii-chart

Version:
150 lines (149 loc) 6.3 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getInput = exports.getLabelShift = exports.getChartSize = exports.getSymbols = void 0; var constants_1 = require("../constants"); var coords_1 = require("./coords"); /** * Merges custom symbols with default axis symbols and defines plot symbols. * @param {object} options - An object containing optional custom symbols. * @param {Symbols} options.symbols - Custom symbols for the plot. * @returns {object} - Object containing the merged axis symbols, and defined symbols for empty, background, and border. */ var getSymbols = function (_a) { var symbols = _a.symbols; var axisSymbols = __assign(__assign({}, constants_1.AXIS), symbols === null || symbols === void 0 ? void 0 : symbols.axis); var emptySymbol = (symbols === null || symbols === void 0 ? void 0 : symbols.empty) || constants_1.EMPTY; var backgroundSymbol = (symbols === null || symbols === void 0 ? void 0 : symbols.background) || emptySymbol; var borderSymbol = symbols === null || symbols === void 0 ? void 0 : symbols.border; return { axisSymbols: axisSymbols, emptySymbol: emptySymbol, backgroundSymbol: backgroundSymbol, borderSymbol: borderSymbol, }; }; exports.getSymbols = getSymbols; /** * Determines plot size and range based on provided data and dimensions. * @param {object} options - An object containing input data and optional dimensions. * @param {MultiLine} options.input - The multiline array of points. * @param {number} [options.width] - Optional width of the plot. * @param {number} [options.height] - Optional height of the plot. * @param {[number, number]} [options.yRange] - Optional range for the y-axis. * @returns {object} - Object containing min x value, plot width, plot height, and x and y expansions. */ var getChartSize = function (_a) { var input = _a.input, width = _a.width, height = _a.height, yRange = _a.yRange; var _b = __read((0, coords_1.toArrays)(input), 2), rangeX = _b[0], rangeY = _b[1]; var minX = (0, coords_1.getMin)(rangeX); var maxX = (0, coords_1.getMax)(rangeX); var minY = (0, coords_1.getMin)(rangeY); var maxY = (0, coords_1.getMax)(rangeY); var expansionX = [minX, maxX]; var expansionY = yRange || [minY, maxY]; // Set default plot dimensions if not provided var plotWidth = width || rangeX.length; var plotHeight = Math.round(height || maxY - minY + 1); // Adjust plot height for small value ranges if no height is provided if (!height && plotHeight < 3) { plotHeight = rangeY.length; } return { minX: minX, minY: minY, plotWidth: plotWidth, plotHeight: plotHeight, expansionX: expansionX, expansionY: expansionY, }; }; exports.getChartSize = getChartSize; /** * Calculates shifts for x and y labels, based on the longest label length. * @param {object} options - The input data and formatting options. * @param {MultiLine} options.input - The multiline array of points. * @param {Formatter} options.transformLabel - A function to transform label values. * @param {number[]} options.expansionX - The x-axis range. * @param {number[]} options.expansionY - The y-axis range. * @param {number} options.minX - The minimum x value for label calculation. * @returns {object} - Object containing the calculated xShift and yShift. */ var getLabelShift = function (_a) { var input = _a.input, transformLabel = _a.transformLabel, expansionX = _a.expansionX, expansionY = _a.expansionY, minX = _a.minX; var xShift = 0; var longestY = 0; // Find the longest labels for x and y axes input.forEach(function (current) { current.forEach(function (_a) { var _b = __read(_a, 2), pointX = _b[0], pointY = _b[1]; xShift = Math.max((0, coords_1.toArray)(transformLabel(pointX, { axis: 'x', xRange: expansionX, yRange: expansionY, })).length, xShift); longestY = Math.max((0, coords_1.toArray)(transformLabel(pointY, { axis: 'y', xRange: expansionX, yRange: expansionY, })).length, longestY); }); }); // Calculate shift for x and y labels based on the longest formatted label var formattedMinX = transformLabel(minX, { axis: 'x', xRange: expansionX, yRange: expansionY, }); // Adjust x-axis shift; -2 ensures space for labels and axis symbols var x0Shift = (0, coords_1.toArray)(formattedMinX).length - 2; var yShift = Math.max(x0Shift, longestY); return { xShift: xShift, yShift: yShift, }; }; exports.getLabelShift = getLabelShift; /** * Normalizes raw input data into a consistent multi-line format. * @param {object} options - Contains the raw input data. * @param {Coordinates} options.rawInput - Input coordinates, either single or multi-line. * @returns {MultiLine} - The formatted data as a multi-line array of points. */ var getInput = function (_a) { var _b; var rawInput = _a.rawInput; var input = rawInput; // Convert single-line data to a multi-line format if needed if (typeof ((_b = input[0]) === null || _b === void 0 ? void 0 : _b[0]) === 'number') { input = [rawInput]; } return input; }; exports.getInput = getInput;