From 1f5570471896b6723b723342d55ad50013ce3b82 Mon Sep 17 00:00:00 2001 From: Marcin Kostrzewa Date: Mon, 18 Mar 2013 01:44:43 +0100 Subject: [PATCH] util: fix util.inspect() line width calculation 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 | 2 +- test/simple/test-util-inspect.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/util.js b/lib/util.js index af9deb8a1d3..3a05337d923 100644 --- a/lib/util.js +++ b/lib/util.js @@ -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) { diff --git a/test/simple/test-util-inspect.js b/test/simple/test-util-inspect.js index 9265f13f0b5..8c894566f72 100644 --- a/test/simple/test-util-inspect.js +++ b/test/simple/test-util-inspect.js @@ -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'] +});