clitable.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. function clitable(obj) {
  2. var headers = {};
  3. if(!obj instanceof Array) return;
  4. // Gather headers
  5. for(var row of obj) {
  6. for(var col of Object.keys(row)) {
  7. if(headers[col] == undefined) headers[col] = {maxLen: col.length};
  8. headers[col].maxLen = Math.max(headers[col].maxLen,String(row[col]).length);
  9. }
  10. }
  11. var tableLen = 0;
  12. for(var k in headers) tableLen += headers[k].maxLen + 3;
  13. tableLen -=1;
  14. var v = '│';
  15. var h = '─';
  16. var cul = '┌';
  17. var cur = '┐';
  18. var cdl = '└';
  19. var cdr = '┘';
  20. var cross = "┼";
  21. var crossD = "┬";
  22. var crossU = "┴";
  23. var crossR = "├";
  24. var crossL = "┤";
  25. var out="",c = 0;
  26. // Top line
  27. out += cul + h;
  28. c = 0;
  29. for(var col in headers) {
  30. out += ((c!=0)?h+ crossD + h:"") +h.repeat(headers[col].maxLen);
  31. c++;
  32. }
  33. out += h + cur +"\n";
  34. // Headers
  35. out += v+" ";
  36. for(var col in headers) {
  37. // Pad Rest
  38. var clen = headers[col].maxLen - (col.length);
  39. out += col + " ".repeat(clen) + " "+v+" ";
  40. }
  41. out+='\n';
  42. // Middle line
  43. out+=crossR+h;
  44. var c = 0;
  45. for(var col in headers) {
  46. out += ((c!=0)?h+ cross + h:"") +h.repeat(headers[col].maxLen);
  47. c++;
  48. }
  49. out += h + crossL +"\n";
  50. //out += (v + h.times(tableLen) + v + "\n" );
  51. for(var row of obj) { // check row len
  52. out += v +" ";
  53. for(var col in headers) {
  54. var clen = headers[col].maxLen - String(row[col]).length;
  55. if(typeof(row[col]) == "number") {
  56. out += " ".repeat(clen) +String(row[col]) + " " + v +" ";
  57. } else {
  58. out += String(row[col]) + " ".repeat(clen) + " " + v +" ";
  59. }
  60. }
  61. out +="\n";
  62. }
  63. // Top line
  64. out += cdl + h;
  65. c = 0;
  66. for(var col in headers) {
  67. out += ((c!=0)?h+ crossU + h:"") +h.repeat(headers[col].maxLen);
  68. c++;
  69. }
  70. out += h + cdr +"\n";
  71. return out;
  72. }
  73. module.exports = clitable;