readline: make \r\n emit one 'line' event
authorBen Noordhuis <info@bnoordhuis.nl>
Mon, 28 Jan 2013 12:13:28 +0000 (13:13 +0100)
committerBen Noordhuis <info@bnoordhuis.nl>
Tue, 29 Jan 2013 16:15:24 +0000 (17:15 +0100)
Make lines ending \r\n emit one 'line' event, not two (where the second
one is an empty string).

This adds a new keypress name: 'return' (as in: 'carriage return').

Fixes #3305.

lib/readline.js
test/simple/test-readline-interface.js

index 354b162..d87d3a3 100644 (file)
@@ -303,7 +303,7 @@ Interface.prototype._normalWrite = function(b) {
   }
   if (string.indexOf('\n') !== -1) {
     // got one or more newlines; process into "line" events
-    var lines = string.split('\n');
+    var lines = string.split(/\r?\n/);
     // either '' or (concievably) the unfinished portion of the next line
     string = lines.pop();
     this._line_buffer = string;
@@ -758,6 +758,7 @@ Interface.prototype._ttyWrite = function(s, key) {
         this._moveCursor(+1);
         break;
 
+      case 'return':  // carriage return, i.e. \r
       case 'home':
         this._moveCursor(-Infinity);
         break;
@@ -885,8 +886,12 @@ function emitKey(stream, s) {
 
   key.sequence = s;
 
-  if (s === '\r' || s === '\n') {
-    // enter
+  if (s === '\r') {
+    // carriage return
+    key.name = 'return';
+
+  } else if (s === '\n') {
+    // enter, should have been called linefeed
     key.name = 'enter';
 
   } else if (s === '\t') {
index a3fde04..856f596 100644 (file)
@@ -113,6 +113,19 @@ FakeInput.prototype.end = function() {};
   assert.equal(callCount, expectedLines.length - 1);
   rli.close();
 
+  // \r\n should emit one line event, not two
+  fi = new FakeInput();
+  rli = new readline.Interface({ input: fi, output: fi, terminal: terminal });
+  expectedLines = ['foo', 'bar', 'baz', 'bat'];
+  callCount = 0;
+  rli.on('line', function(line) {
+    assert.equal(line, expectedLines[callCount]);
+    callCount++;
+  });
+  fi.emit('data', expectedLines.join('\r\n'));
+  assert.equal(callCount, expectedLines.length - 1);
+  rli.close();
+
   // sending a multi-byte utf8 char over multiple writes
   var buf = Buffer('☮', 'utf8');
   fi = new FakeInput();