Interface.prototype._getDisplayPos = function(str) {
var offset = 0;
var col = this.columns;
+ var row = 0;
var code;
str = stripVTControlCharacters(str);
for (var i = 0, len = str.length; i < len; i++) {
if (code >= 0x10000) { // surrogates
i++;
}
+ if (code === 0x0a) { // new line \n
+ offset = 0;
+ row += 1;
+ continue;
+ }
if (isFullWidthCodePoint(code)) {
if ((offset + 1) % col === 0) {
offset++;
}
}
var cols = offset % col;
- var rows = (offset - cols) / col;
+ var rows = row + (offset - cols) / col;
return {cols: cols, rows: rows};
};
assert.equal(callCount, 1);
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.
assert.equal(readline.isFullWidthCodePoint('a'.charCodeAt(0)), false);
assert.equal(readline.isFullWidthCodePoint('あ'.charCodeAt(0)), true);