Add ability to ask question from readline
authorRyan Dahl <ry@tinyclouds.org>
Thu, 30 Dec 2010 09:34:31 +0000 (01:34 -0800)
committerRyan Dahl <ry@tinyclouds.org>
Thu, 30 Dec 2010 09:35:01 +0000 (01:35 -0800)
lib/readline.js

index cc62922..341b20b 100644 (file)
@@ -83,7 +83,13 @@ Interface.prototype.__defineGetter__('columns', function() {
 
 Interface.prototype.setPrompt = function(prompt, length) {
   this._prompt = prompt;
-  this._promptLength = length ? length : Buffer.byteLength(prompt);
+  if (length) {
+    this._promptLength = length;
+  } else {
+    var lines = prompt.split(/[\r\n]/);
+    var lastLine = lines[lines.length - 1];
+    this._promptLength = Buffer.byteLength(lastLine);
+  }
 };
 
 
@@ -97,6 +103,28 @@ Interface.prototype.prompt = function() {
 };
 
 
+Interface.prototype.question = function(query, cb) {
+  if (cb) {
+    this._oldPrompt = this._prompt;
+    this.setPrompt(query);
+    this._questionCallback = cb;
+    this.prompt();
+  }
+};
+
+
+Interface.prototype._onLine = function(line) {
+  if (this._questionCallback) {
+    var cb = this._questionCallback;
+    this._questionCallback = null;
+    this.setPrompt(this._oldPrompt);
+    cb(line)
+  } else {
+    this.emit('line', line);
+  }
+};
+
+
 Interface.prototype._addHistory = function() {
   if (this.line.length === 0) return '';
 
@@ -149,7 +177,7 @@ Interface.prototype.write = function(d) {
 Interface.prototype._normalWrite = function(b) {
   // Very simple implementation right now. Should try to break on
   // new lines.
-  this.emit('line', b.toString());
+  this._onLine(b.toString());
 };
 
 Interface.prototype._insertString = function(c) {
@@ -304,7 +332,7 @@ Interface.prototype._ttyWrite = function(b) {
     case 13:    /* enter */
       var line = this._addHistory();
       this.output.write('\r\n');
-      this.emit('line', line);
+      this._onLine(line);
       break;
 
     case 127:   /* backspace */