114 lines
4.1 KiB
JavaScript
114 lines
4.1 KiB
JavaScript
/**@license
|
|
* __ _____ ________ __
|
|
* / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /
|
|
* __ / // // // // // _ // _// // / / // _ // _// // // \/ // _ \/ /
|
|
* / / // // // // // ___// / / // / / // ___// / / / / // // /\ // // / /__
|
|
* \___//____ \\___//____//_/ _\_ / /_//____//_/ /_/ /_//_//_/ /_/ \__\_\___/
|
|
* \/ /____/
|
|
* http://terminal.jcubic.pl
|
|
*
|
|
* utility that renders simple ascii table, like the one from mysql cli tool
|
|
* it was first created for leash shell https://leash.jcubic.pl
|
|
*
|
|
* usage:
|
|
*
|
|
* var arr = [[1,2,3,4,5], ["lorem", "ipsum", "dolor", "sit", "amet"]];
|
|
* term.echo(ascii_table(arr));
|
|
* // or
|
|
* term.echo(ascii_table(arr, true)); // this will render first row as header
|
|
*
|
|
* Copyright (c) 2018-2019 Jakub Jankiewicz <https://jcubic.pl/me>
|
|
* Released under the MIT license
|
|
*
|
|
*/
|
|
/* global define, module, global, wcwidth, require */
|
|
(function(factory) {
|
|
var root = typeof window !== 'undefined' ? window : global;
|
|
if (typeof define === 'function' && define.amd) {
|
|
// AMD. Register as an anonymous module.
|
|
define(['wcwidth'], function(wcwidth) {
|
|
return (root.ascii_table = factory(wcwidth));
|
|
});
|
|
} else if (typeof module === 'object' && module.exports) {
|
|
// Node/CommonJS
|
|
module.exports = factory(require('wcwidth'));
|
|
} else {
|
|
root.ascii_table = factory(root.wcwidth);
|
|
}
|
|
})(function(wcwidth, undefined) {
|
|
var strlen = (function() {
|
|
if (typeof wcwidth === 'undefined') {
|
|
return function(string) {
|
|
return string.length;
|
|
};
|
|
} else {
|
|
return wcwidth;
|
|
}
|
|
})();
|
|
function ascii_table(array, header) {
|
|
if (!array.length) {
|
|
return '';
|
|
}
|
|
for (var i = array.length - 1; i >= 0; i--) {
|
|
var row = array[i];
|
|
var stacks = [];
|
|
for (var j = 0; j < row.length; j++) {
|
|
var new_lines = row[j].toString().replace(/\r/g).split("\n");
|
|
row[j] = new_lines.shift();
|
|
stacks.push(new_lines);
|
|
}
|
|
var stack_lengths = stacks.map(function(column) {
|
|
return column.length;
|
|
});
|
|
var new_rows_count = Math.max.apply(Math, stack_lengths);
|
|
for (var k = new_rows_count - 1; k >= 0; k--) {
|
|
array.splice(i + 1, 0, stacks.map(function(column) {
|
|
return column[k] || "";
|
|
}));
|
|
}
|
|
}
|
|
var lengths = array[0].map(function(_, i) {
|
|
var col = array.map(function(row) {
|
|
if (row[i] != undefined) {
|
|
var len = strlen(row[i]);
|
|
if (row[i].match(/\t/g)) {
|
|
// tab is 4 spaces
|
|
len += row[i].match(/\t/g).length*3;
|
|
}
|
|
return len;
|
|
} else {
|
|
return 0;
|
|
}
|
|
});
|
|
return Math.max.apply(Math, col);
|
|
});
|
|
// column padding
|
|
array = array.map(function(row) {
|
|
return '| ' + row.map(function(item, i) {
|
|
var size = strlen(item);
|
|
if (item.match(/\t/g)) {
|
|
// tab is 4 spaces
|
|
size += item.match(/\t/g).length*3;
|
|
}
|
|
if (size < lengths[i]) {
|
|
item += new Array(lengths[i] - size + 1).join(' ');
|
|
}
|
|
return item;
|
|
}).join(' | ') + ' |';
|
|
});
|
|
array = array.map(function(line) {
|
|
return line.replace(/&(?![^;]+;)/g, '&');
|
|
});
|
|
var sep = '+' + lengths.map(function(length) {
|
|
return new Array(length + 3).join('-');
|
|
}).join('+') + '+';
|
|
if (header) {
|
|
return sep + '\n' + array[0] + '\n' + sep + '\n' +
|
|
array.slice(1).join('\n') + '\n' + sep;
|
|
} else {
|
|
return sep + '\n' + array.join('\n') + '\n' + sep;
|
|
}
|
|
}
|
|
return ascii_table;
|
|
});
|