@papb/json-excel
Version:
Create a pretty Excel table from JSON data with a very simple API
50 lines • 2.42 kB
JavaScript
;
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