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

@ -1318,11 +1318,11 @@ unitTest(function consoleTable() {
`┌───────┬───────┬───────┬────────┐
(idx) 0 1 Values
0 1
1 2
2 3 [ 4 ]
3 5 6
4 [ 7 ] [ 8 ]
0 1
1 2
2 3 [ 4 ]
3 5 6
4 [ 7 ] [ 8 ]
`,
);
@ -1334,10 +1334,10 @@ unitTest(function consoleTable() {
`┌────────────┬────────┐
(iter idx) Values
0 1
1 2
2 3
3 "test"
0 1
1 2
2 3
3 "test"
`,
);
@ -1354,8 +1354,8 @@ unitTest(function consoleTable() {
`┌────────────┬─────┬────────┐
(iter idx) Key Values
0 1 "one"
1 2 "two"
0 1 "one"
1 2 "two"
`,
);
@ -1395,11 +1395,11 @@ unitTest(function consoleTable() {
`┌───────┬────────┬──────────────────────┬────┬────────┐
(idx) 0 1 a Values
0 1
1 "test"
2 false
3 10
4 "test" { b: 20, c: "test" }
0 1
1 "test"
2 false
3 10
4 "test" { b: 20, c: "test" }
`,
);
@ -1459,9 +1459,9 @@ unitTest(function consoleTable() {
`┌───────┬─────────┐
(idx) Values
0 "Hello"
1 "你好"
2 "Amapá"
0 "Hello"
1 "你好"
2 "Amapá"
`,
);
@ -1476,8 +1476,8 @@ unitTest(function consoleTable() {
`┌───────┬───┬───┐
(idx) 0 1
0 1 2
1 3 4
0 1 2
1 3 4
`,
);
@ -1489,9 +1489,9 @@ unitTest(function consoleTable() {
`┌───────┬───┐
(idx) b
1 5
2
3 6
1 5
2
3 6
`,
);
@ -1503,10 +1503,10 @@ unitTest(function consoleTable() {
`┌───────┬───┬───┐
(idx) a b
0 0
1 1 1
2 2
3 3 3
0 0
1 1 1
2 2
3 3 3
`,
);
@ -1521,10 +1521,10 @@ unitTest(function consoleTable() {
`┌───────┬───┬───┬───┐
(idx) a b c
0 0
1 1 1
2 2
3 3 3
0 0
1 1 1
2 2
3 3 3
`,
);

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 +=