1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-01-11 08:33:43 -05:00

feat(extensions/console): right align numeric columns in table (#11748)

This commit is contained in:
Nicolas Stucki 2021-08-24 17:17:40 +02:00 committed by GitHub
parent 93d83a84db
commit c4561ac969
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 47 additions and 36 deletions

View file

@ -191,13 +191,17 @@
return width;
}
function renderRow(row, columnWidths) {
function renderRow(row, columnWidths, columnRightAlign) {
let out = tableChars.left;
for (let i = 0; i < row.length; i++) {
const cell = row[i];
const len = getStringWidth(cell);
const needed = columnWidths[i] - len;
out += `${cell}${StringPrototypeRepeat(" ", needed)}`;
const padding = StringPrototypeRepeat(" ", columnWidths[i] - len);
if (columnRightAlign?.[i]) {
out += `${padding}${cell}`;
} else {
out += `${cell}${padding}`;
}
if (i !== row.length - 1) {
out += tableChars.middle;
}
@ -206,6 +210,11 @@
return out;
}
function canRightAlign(value) {
const isNumber = !isNaN(value);
return isNumber;
}
function cliTable(head, columns) {
const rows = [];
const columnWidths = ArrayPrototypeMap(head, (h) => getStringWidth(h));
@ -214,6 +223,7 @@
(n, a) => MathMax(n, a.length),
0,
);
const columnRightAlign = new Array(columnWidths.length).fill(true);
for (let i = 0; i < head.length; i++) {
const column = columns[i];
@ -225,6 +235,7 @@
const width = columnWidths[i] || 0;
const counted = getStringWidth(value);
columnWidths[i] = MathMax(width, counted);
columnRightAlign[i] &= canRightAlign(value);
}
}
@ -244,7 +255,7 @@
`${tableChars.rightMiddle}\n`;
for (const row of rows) {
result += `${renderRow(row, columnWidths)}\n`;
result += `${renderRow(row, columnWidths, columnRightAlign)}\n`;
}
result +=