UNPKG

@papb/json-excel

Version:

Create a pretty Excel table from JSON data with a very simple API

50 lines 2.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getAutoFitCellSizes = exports.getStringHeight = void 0; const numeric_helpers_1 = require("./numeric-helpers"); const visual_string_width_1 = require("./visual-string-width"); function getStringHeight(string, maxVisualWidth) { const lines = string.split(/\r?\n/); if (!maxVisualWidth) { return lines.length; } return lines.length + numeric_helpers_1.getSum(lines.map(line => visual_string_width_1.predictAmountOfLineWraps(line, maxVisualWidth))); } exports.getStringHeight = getStringHeight; function getMinimalFittingColumnWidth(cellsInColumn) { return numeric_helpers_1.getMax(cellsInColumn.map(cell => visual_string_width_1.getStringVisualWidth(cell))); } function getMinimalFittingRowHeight(cellsInRow, realColumnWidths) { // Since the actual applied column width may be different from the minimal fitting // column width, in a few edge cases the minimal fitting height might be actually // greater than 1 + the number of explicit linebreaks in the string, due to auto-applied // line wraps in long lines. const maxAmountOfLines = numeric_helpers_1.getMax(cellsInRow.map((cell, index) => getStringHeight(cell, realColumnWidths[index]))); return 15 * maxAmountOfLines; } function getAutoFitCellSizes(data, considerExtraRoomForHeaderFilterArrow, options) { const result = { columnWidths: [], rowHeights: [] }; const rowCount = data.length; const columnCount = data[0].length; for (let ci = 0; ci < columnCount; ci++) { let width = getMinimalFittingColumnWidth(data.map(row => row[ci])); if (considerExtraRoomForHeaderFilterArrow) { width = Math.max(width, 4 + visual_string_width_1.getStringVisualWidth(data[0][ci])); } width += options.horizontalPadding; width = numeric_helpers_1.clamp(width, options.minWidth, options.maxWidth); result.columnWidths.push(width); } for (let ri = 0; ri < rowCount; ri++) { let height = getMinimalFittingRowHeight(data[ri], result.columnWidths); height += options.verticalPadding; height = numeric_helpers_1.clamp(height, options.minHeight, options.maxHeight); result.rowHeights.push(height); } return result; } exports.getAutoFitCellSizes = getAutoFitCellSizes; //# sourceMappingURL=auto-sizes.js.map