UNPKG

3.41 kBJavaScriptView Raw
1/**
2 * Module dependencies.
3 */
4
5var _ = require("lodash")
6 , util = require("./util")
7 , ut = require("util")
8 ;
9
10/**
11 * Initialize a new `Logger` instance.
12 *
13 * @return {Logger}
14 * @api public
15 */
16
17function viewed(str) {
18 var re = /\u001b\[\d+m/gm;
19 return String(str).replace(re, "");
20}
21
22function trimTo(str, amt) {
23
24 var raw = "";
25 var visual = viewed(str).slice(0, amt);
26 var result = "";
27 for (var i = 0; i < str.length; ++i) {
28 raw = raw + str[i];
29 if (viewed(raw) === visual) {
30 result = raw; break;
31 }
32 }
33
34 if (result.length < amt - 10) {
35 return result;
36 }
37
38 var newResult = result; var found = false;
39 for (var j = result.length; j > 0; --j) {
40 if (result[j] === " ") {
41 found = true;
42 break;
43 } else {
44 newResult = newResult.slice(0, newResult.length - 1);
45 }
46 }
47
48 if (found === true) {
49 return newResult;
50 } else {
51 return result;
52 }
53
54}
55
56function Logger(cons) {
57
58 var logger = cons || console;
59
60 log = function() {
61 logger.log.apply(logger, arguments);
62 };
63
64 log.cols = function() {
65
66 var width = process.stdout.columns
67 , pads = 0
68 , padsWidth = 0
69 , cols = 0
70 , colsWidth = 0
71 ;
72
73 var input = arguments;
74
75 for (var h = 0; h < arguments.length; ++h) {
76 if (typeof arguments[h] === "number") {
77 padsWidth = padsWidth + arguments[h];
78 pads++;
79 }
80 if (_.isArray(arguments[h]) && typeof arguments[h][0] === "number") {
81 padsWidth = padsWidth + arguments[h][0];
82 pads++;
83 }
84 }
85
86 cols = arguments.length - pads;
87 colsWidth = Math.floor((width - padsWidth) / cols);
88
89 var lines = [];
90
91 var go = function() {
92 var str = "", done = true;
93 for (var i = 0; i < input.length; ++i) {
94
95 if (typeof input[i] === "number") {
96 str = str + util.pad("", input[i], " ");
97 } else if (_.isArray(input[i]) && typeof input[i][0] === "number") {
98 str = str + util.pad("", input[i][0], input[i][1]);
99 } else {
100
101 var chosenWidth = colsWidth + 0;
102
103 var trimmed = trimTo(input[i], colsWidth);
104 var trimmedLength = trimmed.length;
105
106 var re = /\\u001b\[\d+m/gm;
107 var matches = ut.inspect(trimmed).match(re);
108 var color = "";
109
110 // Ugh. We're chopping a line, so we have to look for unfinished
111 // color assignments and throw them on the next line.
112 if (matches && matches[matches.length - 1] !== "\\u001b[39m") {
113 trimmed = trimmed + "\u001b[39m";
114 var number = String(matches[matches.length - 1]).slice(7, 9);
115 color = "\x1B[" + number + "m";
116 }
117
118 input[i] = color + String(input[i].slice(trimmedLength, input[i].length)).trim();
119 str = str + util.pad(String(trimmed).trim(), chosenWidth, " ");
120 if (viewed(input[i]).trim() !== "") { done = false; }
121 }
122 }
123 lines.push(str);
124 if (!done) {
125 go();
126 }
127 };
128 go();
129
130 for (var i = 0; i < lines.length; ++i) {
131 logger.log(lines[i]);
132 }
133 return this;
134 };
135
136 log.br = function() {
137 logger.log(" ");
138 return this;
139 };
140
141 return this.log;
142}
143
144/**
145 * Expose `logger`.
146 */
147
148module.exports = exports = Logger;