1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- function clitable(obj) {
- var headers = {};
- if(!obj instanceof Array) return;
- // Gather headers
- for(var row of obj) {
- for(var col of Object.keys(row)) {
- if(headers[col] == undefined) headers[col] = {maxLen: col.length};
- headers[col].maxLen = Math.max(headers[col].maxLen,String(row[col]).length);
- }
- }
-
- var tableLen = 0;
- for(var k in headers) tableLen += headers[k].maxLen + 3;
- tableLen -=1;
- var v = '│';
- var h = '─';
- var cul = '┌';
- var cur = '┐';
- var cdl = '└';
- var cdr = '┘';
- var cross = "┼";
-
- var crossD = "┬";
- var crossU = "┴";
- var crossR = "├";
- var crossL = "┤";
- var out="",c = 0;
- // Top line
- out += cul + h;
- c = 0;
- for(var col in headers) {
- out += ((c!=0)?h+ crossD + h:"") +h.repeat(headers[col].maxLen);
- c++;
- }
- out += h + cur +"\n";
- // Headers
- out += v+" ";
- for(var col in headers) {
- // Pad Rest
- var clen = headers[col].maxLen - (col.length);
- out += col + " ".repeat(clen) + " "+v+" ";
- }
- out+='\n';
- // Middle line
- out+=crossR+h;
- var c = 0;
- for(var col in headers) {
- out += ((c!=0)?h+ cross + h:"") +h.repeat(headers[col].maxLen);
- c++;
- }
- out += h + crossL +"\n";
- //out += (v + h.times(tableLen) + v + "\n" );
- for(var row of obj) { // check row len
- out += v +" ";
- for(var col in headers) {
- var clen = headers[col].maxLen - String(row[col]).length;
- if(typeof(row[col]) == "number") {
- out += " ".repeat(clen) +String(row[col]) + " " + v +" ";
- } else {
- out += String(row[col]) + " ".repeat(clen) + " " + v +" ";
- }
- }
- out +="\n";
- }
-
- // Top line
- out += cdl + h;
- c = 0;
- for(var col in headers) {
- out += ((c!=0)?h+ crossU + h:"") +h.repeat(headers[col].maxLen);
- c++;
- }
- out += h + cdr +"\n";
- return out;
-
- }
- module.exports = clitable;
|