Browse Source

readline: consider newlines for cursor position

Fixes #7266.
Closes #7279.
v0.11.13-release
Yazhong Liu 11 years ago
committed by Nathan Rajlich
parent
commit
93c3674ff7
  1. 8
      lib/readline.js
  2. 26
      test/simple/test-readline-interface.js

8
lib/readline.js

@ -563,6 +563,7 @@ Interface.prototype._historyPrev = function() {
Interface.prototype._getDisplayPos = function(str) { Interface.prototype._getDisplayPos = function(str) {
var offset = 0; var offset = 0;
var col = this.columns; var col = this.columns;
var row = 0;
var code; var code;
str = stripVTControlCharacters(str); str = stripVTControlCharacters(str);
for (var i = 0, len = str.length; i < len; i++) { for (var i = 0, len = str.length; i < len; i++) {
@ -570,6 +571,11 @@ Interface.prototype._getDisplayPos = function(str) {
if (code >= 0x10000) { // surrogates if (code >= 0x10000) { // surrogates
i++; i++;
} }
if (code === 0x0a) { // new line \n
offset = 0;
row += 1;
continue;
}
if (isFullWidthCodePoint(code)) { if (isFullWidthCodePoint(code)) {
if ((offset + 1) % col === 0) { if ((offset + 1) % col === 0) {
offset++; offset++;
@ -580,7 +586,7 @@ Interface.prototype._getDisplayPos = function(str) {
} }
} }
var cols = offset % col; var cols = offset % col;
var rows = (offset - cols) / col; var rows = row + (offset - cols) / col;
return {cols: cols, rows: rows}; return {cols: cols, rows: rows};
}; };

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

@ -206,6 +206,32 @@ FakeInput.prototype.end = function() {};
assert.equal(callCount, 1); assert.equal(callCount, 1);
rli.close(); rli.close();
if (terminal) {
// question
fi = new FakeInput();
rli = new readline.Interface({ input: fi, output: fi, terminal: terminal });
expectedLines = ['foo'];
rli.question(expectedLines[0], function() {
rli.close();
});
var cursorPos = rli._getCursorPos();
assert.equal(cursorPos.rows, 0);
assert.equal(cursorPos.cols, expectedLines[0].length);
rli.close();
// sending a multi-line question
fi = new FakeInput();
rli = new readline.Interface({ input: fi, output: fi, terminal: terminal });
expectedLines = ['foo', 'bar'];
rli.question(expectedLines.join('\n'), function() {
rli.close();
});
var cursorPos = rli._getCursorPos();
assert.equal(cursorPos.rows, expectedLines.length - 1);
assert.equal(cursorPos.cols, expectedLines.slice(-1)[0].length);
rli.close();
}
// wide characters should be treated as two columns. // wide characters should be treated as two columns.
assert.equal(readline.isFullWidthCodePoint('a'.charCodeAt(0)), false); assert.equal(readline.isFullWidthCodePoint('a'.charCodeAt(0)), false);
assert.equal(readline.isFullWidthCodePoint('あ'.charCodeAt(0)), true); assert.equal(readline.isFullWidthCodePoint('あ'.charCodeAt(0)), true);

Loading…
Cancel
Save