Files
enviPy-bayer/static/js/ketcher2/node_modules/cli-columns/src/cli-columns.js
2025-06-23 20:13:54 +02:00

72 lines
1.5 KiB
JavaScript

var assign = require('object-assign');
var stringWidth = require('string-width');
var stripAnsi = require('strip-ansi');
var concat = Array.prototype.concat;
var defaults = {
character: ' ',
newline: '\n',
padding: 2,
sort: true,
width: 0
};
function byPlainText(a, b) {
return stripAnsi(a) > stripAnsi(b) ? 1 : -1;
}
function makeArray() {
return [];
}
function makeList(count) {
return Array.apply(null, Array(count));
}
function padCell(fullWidth, character, value) {
var valueWidth = stringWidth(value);
var filler = makeList(fullWidth - valueWidth + 1);
return value + filler.join(character);
}
function toRows(rows, cell, i) {
rows[i % rows.length].push(cell);
return rows;
}
function toString(arr) {
return arr.join('');
}
function columns(values, options) {
values = concat.apply([], values);
options = assign({}, defaults, options);
var cells = values
.filter(Boolean)
.map(String);
if (options.sort !== false) {
cells = cells.sort(byPlainText);
}
var termWidth = options.width || process.stdout.columns;
var cellWidth = Math.max.apply(null, cells.map(stringWidth)) + options.padding;
var columnCount = Math.floor(termWidth / cellWidth) || 1;
var rowCount = Math.ceil(cells.length / columnCount) || 1;
if (columnCount === 1) {
return cells.join(options.newline);
}
return cells
.map(padCell.bind(null, cellWidth, options.character))
.reduce(toRows, makeList(rowCount).map(makeArray))
.map(toString)
.join(options.newline);
}
module.exports = columns;