diff --git a/lib/widget.js b/lib/widget.js index d5b392f..1771383 100644 --- a/lib/widget.js +++ b/lib/widget.js @@ -1061,7 +1061,8 @@ Screen.prototype.draw = function(start, end) { // this seems to be the way ncurses does it. if (this.tput) { if (this.tput.strings.enter_alt_charset_mode) { - if (!this.tput.brokenACS || !this.tput.unicode) { + //if (!this.tput.brokenACS || !this.tput.unicode) { + if (!this.tput.brokenACS) { if (this.tput.acscr[ch]) { if (acs) { ch = this.tput.acscr[ch]; @@ -1083,14 +1084,60 @@ Screen.prototype.draw = function(start, end) { // are it does not support UTF8. This is probably // the "safest" way to do this. Should fix things // like sun-color. - // if (this.program.term('sun') && ch > '~') { // if (this.tput.numbers.U8 !== 1 && ch > '~') { + // if ((!this.unicode || this.tput.numbers.U8 !== 1) && this.tput.utoa[ch]) { if (this.tput.numbers.U8 !== 1 && this.tput.utoa[ch]) { ch = this.tput.utoa[ch] || '?'; } } } + // Attempt to use ACS for supported characters. + // This is not ideal, but it's how ncurses works. + // There are a lot of terminals that support ACS + // *and UTF8, but do not declare U8. So ACS ends + // up being used (slower than utf8). Terminals + // that do not support ACS and do not explicitly + // support UTF8 get their unicode characters + // replaced with really ugly ascii characters. + // It is possible there is a terminal out there + // somewhere that does not support ACS, but + // supports UTF8, but I imagine it's unlikely. + // Maybe remove !this.tput.unicode check, however, + // this seems to be the way ncurses does it. + if (0 && this.tput) { + if (this.tput.strings.enter_alt_charset_mode && !this.tput.brokenACS) { + if (this.tput.acscr[ch]) { + if (acs) { + ch = this.tput.acscr[ch]; + } else { + ch = this.tput.smacs() + + this.tput.acscr[ch]; + acs = true; + } + } else if (acs) { + ch = this.tput.rmacs() + ch; + acs = false; + } + } else { + // U8 is not consistently correct. Some terminfo's + // terminals that do not declare it may actually + // support utf8 (e.g. urxvt), but if the terminal + // does not declare support for ACS (and U8), chances + // are it does not support UTF8. This is probably + // the "safest" way to do this. Should fix things + // like sun-color. + if ((!this.unicode + || (!this.tput.strings.enter_alt_charset_mode + && this.tput.numbers.U8 !== 1)) + && ch > '~') { + ch = this.tput.utoa[ch] || '?'; + } + } + } + + // if (wideChars.test(ch)) x++; + out += ch; attr = data; } @@ -1978,7 +2025,7 @@ Element.prototype.parseContent = function(noTags) { .replace(/\x1b(?!\[[\d;]*m)/g, '') .replace(/\r\n|\r/g, '\n') .replace(/\t/g, this.screen.tabc) - .replace(dwidthChars, '?'); + .replace(wideChars, '?'); if (!noTags) { content = this._parseTags(content); @@ -3089,6 +3136,12 @@ Element.prototype.render = function() { lines[y][x][1] = ch; lines[y].dirty = true; } + + // if (wideChars.test(ch)) { + // x++; + // lines[y][x][0] = attr; + // lines[y][x][1] = ' '; + // } } } @@ -5811,7 +5864,7 @@ function hsort(obj) { }); } -var dwidthChars = new RegExp('([' +var wideChars = new RegExp('([' + '\\uff01-\\uffbe' + '\\uffc2-\\uffc7' + '\\uffca-\\uffcf'