util: add sprintf-like format() function
authorBen Noordhuis <info@bnoordhuis.nl>
Fri, 29 Jul 2011 15:26:45 +0000 (17:26 +0200)
committerBen Noordhuis <info@bnoordhuis.nl>
Sat, 30 Jul 2011 00:11:31 +0000 (02:11 +0200)
Fixes #1407.

lib/console.js
lib/util.js
test/simple/test-util-format.js [new file with mode: 0644]

index 54a4d811fe52c5513d5fc07d2285b859a6b992c9..873d27c4e89f1ca381a5718edd2eeb89fa85bf86 100644 (file)
 // USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 var writeError = process.binding('stdio').writeError;
-
-// console object
-var formatRegExp = /%[sdj]/g;
-function format(f) {
-  var util = require('util');
-
-  if (typeof f !== 'string') {
-    var objects = [];
-    for (var i = 0; i < arguments.length; i++) {
-      objects.push(util.inspect(arguments[i]));
-    }
-    return objects.join(' ');
-  }
-
-
-  var i = 1;
-  var args = arguments;
-  var str = String(f).replace(formatRegExp, function(x) {
-    switch (x) {
-      case '%s': return String(args[i++]);
-      case '%d': return Number(args[i++]);
-      case '%j': return JSON.stringify(args[i++]);
-      default:
-        return x;
-    }
-  });
-  for (var len = args.length, x = args[i]; i < len; x = args[++i]) {
-    if (x === null || typeof x !== 'object') {
-      str += ' ' + x;
-    } else {
-      str += ' ' + util.inspect(x);
-    }
-  }
-  return str;
-}
-
+var util = require('util');
 
 exports.log = function() {
-  process.stdout.write(format.apply(this, arguments) + '\n');
+  process.stdout.write(util.format.apply(this, arguments) + '\n');
 };
 
 
@@ -66,7 +31,7 @@ exports.info = exports.log;
 
 
 exports.warn = function() {
-  writeError(format.apply(this, arguments) + '\n');
+  writeError(util.format.apply(this, arguments) + '\n');
 };
 
 
@@ -74,7 +39,6 @@ exports.error = exports.warn;
 
 
 exports.dir = function(object) {
-  var util = require('util');
   process.stdout.write(util.inspect(object) + '\n');
 };
 
@@ -105,6 +69,6 @@ exports.trace = function(label) {
 exports.assert = function(expression) {
   if (!expression) {
     var arr = Array.prototype.slice.call(arguments, 1);
-    require('assert').ok(false, format.apply(this, arr));
+    require('assert').ok(false, util.format.apply(this, arr));
   }
 };
index ae6cc2da6aa00efa90dbad54cf56848d4d6a63f7..0630d94b895a8801102a1956cc3d100ba2b3a74a 100644 (file)
 var events = require('events');
 
 
+var formatRegExp = /%[sdj]/g;
+exports.format = function(f) {
+  if (typeof f !== 'string') {
+    var objects = [];
+    for (var i = 0; i < arguments.length; i++) {
+      objects.push(inspect(arguments[i]));
+    }
+    return objects.join(' ');
+  }
+
+  var i = 1;
+  var args = arguments;
+  var str = String(f).replace(formatRegExp, function(x) {
+    switch (x) {
+      case '%s': return String(args[i++]);
+      case '%d': return Number(args[i++]);
+      case '%j': return JSON.stringify(args[i++]);
+      default:
+        return x;
+    }
+  });
+  for (var len = args.length, x = args[i]; i < len; x = args[++i]) {
+    if (x === null || typeof x !== 'object') {
+      str += ' ' + x;
+    } else {
+      str += ' ' + inspect(x);
+    }
+  }
+  return str;
+}
+
+
 exports.print = function() {
   for (var i = 0, len = arguments.length; i < len; ++i) {
     process.stdout.write(String(arguments[i]));
@@ -59,7 +91,7 @@ var error = exports.error = function(x) {
  * @param {Boolean} colors Flag to turn on ANSI escape codes to color the
  *    output. Default is false (no coloring).
  */
-exports.inspect = function(obj, showHidden, depth, colors) {
+function inspect(obj, showHidden, depth, colors) {
   var seen = [];
 
   var stylize = function(str, styleType) {
@@ -279,7 +311,8 @@ exports.inspect = function(obj, showHidden, depth, colors) {
     return output;
   }
   return format(obj, (typeof depth === 'undefined' ? 2 : depth));
-};
+}
+exports.inspect = inspect;
 
 
 function isArray(ar) {
diff --git a/test/simple/test-util-format.js b/test/simple/test-util-format.js
new file mode 100644 (file)
index 0000000..2525680
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var util = require('util');
+
+assert.equal(util.format(), '');
+assert.equal(util.format(''), '');
+assert.equal(util.format([]), '[]');
+assert.equal(util.format({}), '{}');
+assert.equal(util.format(null), 'null');
+assert.equal(util.format(true), 'true');
+assert.equal(util.format(false), 'false');
+assert.equal(util.format('test'), 'test');
+
+// CHECKME this is for console.log() compatibility - but is it *right*?
+assert.equal(util.format('foo', 'bar', 'baz'), 'foo bar baz');
+
+assert.equal(util.format('%d', 42.0), '42');
+assert.equal(util.format('%d', 42), '42');
+assert.equal(util.format('%s', 42), '42');
+assert.equal(util.format('%j', 42), '42');
+
+assert.equal(util.format('%d', '42.0'), '42');
+assert.equal(util.format('%d', '42'), '42');
+assert.equal(util.format('%s', '42'), '42');
+assert.equal(util.format('%j', '42'), '"42"');
\ No newline at end of file