repl: add a 'useColors' option to the repl
authorNathan Rajlich <nathan@tootallnate.net>
Wed, 28 Mar 2012 01:00:59 +0000 (18:00 -0700)
committerNathan Rajlich <nathan@tootallnate.net>
Wed, 28 Mar 2012 01:00:59 +0000 (18:00 -0700)
This should only be minimally used, since the `terminal` value will usually be
what you are expecting. This option is specifically for the case where `terminal`
is false, but you still want colors to be output (or vice-versa).

doc/api/repl.markdown
lib/_debugger.js
lib/repl.js
src/node.js
test/simple/test-repl-options.js

index 8ce2cea..2104136 100644 (file)
@@ -47,6 +47,10 @@ takes the following values:
  - `eval` - function that will be used to eval each given line. Defaults to
    an async wrapper for `eval()`. See below for an example of a custom `eval`.
 
+ - `useColors` - a boolean which specifies whether or not the `writer` function
+   should output colors. If a different `writer` function is set then this does
+   nothing. Defaults to the repl's `terminal` value.
+
  - `useGlobal` - if set to `true`, then the repl will use the `global` object,
    instead of running scripts in a separate context. Defaults to `false`.
 
index 64ea20d..f1da313 100644 (file)
@@ -690,14 +690,14 @@ var helpMessage = 'Commands: ' + commands.map(function(group) {
 }).join(',\n');
 
 
-function SourceUnderline(sourceText, position, tty) {
+function SourceUnderline(sourceText, position, repl) {
   if (!sourceText) return '';
 
   var head = sourceText.slice(0, position),
       tail = sourceText.slice(position);
 
   // Colourize char if stdout supports colours
-  if (tty && !repl.disableColors) {
+  if (repl.useColors) {
     tail = tail.replace(/(.+?)([^\w]|$)/, '\033[32m$1\033[39m$2');
   }
 
@@ -758,6 +758,9 @@ function Interface(stdin, stdout, args) {
   if (parseInt(process.env['NODE_NO_READLINE'], 10)) {
     opts.terminal = false;
   }
+  if (parseInt(process.env['NODE_DISABLE_COLORS'], 10)) {
+    opts.useColors = false;
+  }
   this.repl = repl.start(opts);
 
   // Do not print useless warning
@@ -1134,7 +1137,7 @@ Interface.prototype.list = function(delta) {
       if (current) {
         line = SourceUnderline(lines[i],
                                client.currentSourceColumn,
-                               self.stdout.isTTY);
+                               self.repl);
       } else {
         line = lines[i];
       }
index 711454c..505648b 100644 (file)
@@ -58,8 +58,6 @@ function hasOwnProperty(obj, prop) {
 
 var context;
 
-exports.disableColors = process.env.NODE_DISABLE_COLORS ? true : false;
-
 // hack for require.resolve("./relative") to work properly.
 module.filename = path.resolve('repl');
 
@@ -163,8 +161,12 @@ function REPLServer(prompt, stream, eval, useGlobal, ignoreUndefined) {
   // figure out which "writer" function to use
   self.writer = options.writer || exports.writer;
 
-  if (rli.terminal && !exports.disableColors &&
-      self.writer === util.inspect) {
+  if (typeof options.useColors === 'undefined') {
+    options.useColors = rli.terminal;
+  }
+  self.useColors = !!options.useColors;
+
+  if (self.useColors && self.writer === util.inspect) {
     // Turn on ANSI coloring.
     self.writer = function(obj, showHidden, depth) {
       return util.inspect(obj, showHidden, depth, true);
index 3229416..ade49aa 100644 (file)
         if (parseInt(process.env['NODE_NO_READLINE'], 10)) {
           opts.terminal = false;
         }
+        if (parseInt(process.env['NODE_DISABLE_COLORS'], 10)) {
+          opts.useColors = false;
+        }
         var repl = Module.requireRepl().start(opts);
         repl.on('exit', function() {
           process.exit();
index 17d7646..c3a83ae 100644 (file)
@@ -40,6 +40,7 @@ assert.equal(r1.rli.output, stream);
 assert.equal(r1.rli.input, r1.inputStream);
 assert.equal(r1.rli.output, r1.outputStream);
 assert.equal(r1.rli.terminal, true);
+assert.equal(r1.useColors, r1.rli.terminal);
 assert.equal(r1.useGlobal, false);
 assert.equal(r1.ignoreUndefined, false);
 
@@ -50,6 +51,7 @@ var r2 = repl.start({
   input: stream,
   output: stream,
   terminal: false,
+  useColors: true,
   useGlobal: true,
   ignoreUndefined: true,
   eval: evaler,
@@ -60,6 +62,7 @@ assert.equal(r2.rli.output, stream);
 assert.equal(r2.rli.input, r2.inputStream);
 assert.equal(r2.rli.output, r2.outputStream);
 assert.equal(r2.rli.terminal, false);
+assert.equal(r2.useColors, true);
 assert.equal(r2.useGlobal, true);
 assert.equal(r2.ignoreUndefined, true);
 assert.equal(r2.eval, evaler);