util: fix util.inspect() line width calculation
authorMarcin Kostrzewa <marcinkostrzewa@yahoo.com>
Mon, 18 Mar 2013 00:44:43 +0000 (01:44 +0100)
committerBen Noordhuis <info@bnoordhuis.nl>
Thu, 28 Mar 2013 12:50:52 +0000 (13:50 +0100)
Have the formatter filter out vt100 color codes when calculating the
line width. Stops it from unnecessarily splitting strings over multiple
lines.

Fixes #5039.

lib/util.js
test/simple/test-util-inspect.js

index af9deb8..3a05337 100644 (file)
@@ -418,7 +418,7 @@ function reduceToSingleString(output, base, braces) {
   var length = output.reduce(function(prev, cur) {
     numLinesEst++;
     if (cur.indexOf('\n') >= 0) numLinesEst++;
-    return prev + cur.length + 1;
+    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
   }, 0);
 
   if (length > 60) {
index 9265f13..8c89456 100644 (file)
@@ -160,3 +160,31 @@ assert(util.inspect(subject, { customInspect: false }).indexOf('inspect') !== -1
 subject.inspect = function() { return { foo: 'bar' }; };
 
 assert.equal(util.inspect(subject), '{ foo: \'bar\' }');
+
+// util.inspect with "colors" option should produce as many lines as without it
+function test_lines(input) {
+  var count_lines = function(str) {
+    return (str.match(/\n/g) || []).length;
+  }
+
+  var without_color = util.inspect(input);
+  var with_color = util.inspect(input, {colors: true});
+  assert.equal(count_lines(without_color), count_lines(with_color));
+}
+
+test_lines([1, 2, 3, 4, 5, 6, 7]);
+test_lines(function() {
+  var big_array = [];
+  for (var i = 0; i < 100; i++) {
+    big_array.push(i);
+  }
+  return big_array;
+}());
+test_lines({foo: 'bar', baz: 35, b: {a: 35}});
+test_lines({
+  foo: 'bar',
+  baz: 35,
+  b: {a: 35},
+  very_long_key: 'very_long_value',
+  even_longer_key: ['with even longer value in array']
+});