mirror of
https://github.com/titanscouting/tra-analysis.git
synced 2025-03-20 03:55:18 +00:00
84 lines
1.6 KiB
JavaScript
84 lines
1.6 KiB
JavaScript
'use strict';
|
|
|
|
const stringWidth = require('string-width');
|
|
const stripAnsi = require('strip-ansi');
|
|
|
|
const concat = Array.prototype.concat;
|
|
const defaults = {
|
|
character: ' ',
|
|
newline: '\n',
|
|
padding: 2,
|
|
sort: true,
|
|
width: 0
|
|
};
|
|
|
|
function byPlainText(a, b) {
|
|
const plainA = stripAnsi(a);
|
|
const plainB = stripAnsi(b);
|
|
|
|
if (plainA === plainB) {
|
|
return 0;
|
|
}
|
|
|
|
if (plainA > plainB) {
|
|
return 1;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
function makeArray() {
|
|
return [];
|
|
}
|
|
|
|
function makeList(count) {
|
|
return Array.apply(null, Array(count));
|
|
}
|
|
|
|
function padCell(fullWidth, character, value) {
|
|
const valueWidth = stringWidth(value);
|
|
const 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 = Object.assign({}, defaults, options);
|
|
|
|
let cells = values
|
|
.filter(Boolean)
|
|
.map(String);
|
|
|
|
if (options.sort !== false) {
|
|
cells = cells.sort(byPlainText);
|
|
}
|
|
|
|
const termWidth = options.width || process.stdout.columns;
|
|
const cellWidth = Math.max.apply(null, cells.map(stringWidth)) + options.padding;
|
|
const columnCount = Math.floor(termWidth / cellWidth) || 1;
|
|
const 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;
|