simple-ascii-chart
Version:
Simple ascii chart generator
150 lines (149 loc) • 6.3 kB
JavaScript
;
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;