From 21a79fea6555b094deb710f76b63afd2e08498b6 Mon Sep 17 00:00:00 2001 From: Joe Cheng Date: Wed, 23 Mar 2011 12:57:00 -0700 Subject: [PATCH] Respect full width property of all East Asian characters Common Japanese punctuation (comma, period) was being treated as half-width, causing cursor positioning to be off. The new code is comprehensive for code points in the Basic Multilingual Plane. See https://gist.github.com/883802 for the script I used to generate the code. --- lib/ace/edit_session.js | 65 ++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index 6c33c449..a296b694 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -962,14 +962,8 @@ var EditSession = function(text, mode) { else if(c == 32) { arr.push(SPACE); } - // CJK characters - else if ( - c >= 0x3040 && c <= 0x309F || // Hiragana - c >= 0x30A0 && c <= 0x30FF || // Katakana - c >= 0x4E00 && c <= 0x9FFF || // Single CJK ideographs - c >= 0xF900 && c <= 0xFAFF || - c >= 0x3400 && c <= 0x4DBF - ) { + // full width characters + else if (isFullWidth(c)) { arr.push(CHAR, CHAR_EXT); } else { arr.push(CHAR); @@ -995,14 +989,8 @@ var EditSession = function(text, mode) { if (c == 9) { screenColumn += tabSize; } - // CJK characters - else if ( - c >= 0x3040 && c <= 0x309F || // Hiragana - c >= 0x30A0 && c <= 0x30FF || // Katakana - c >= 0x4E00 && c <= 0x9FFF || // Single CJK ideographs - c >= 0xF900 && c <= 0xFAFF || - c >= 0x3400 && c <= 0x4DBF - ) { + // full width characters + else if (isFullWidth(c)) { screenColumn += 2; } else { screenColumn += 1; @@ -1149,14 +1137,8 @@ var EditSession = function(text, mode) { docColumn -= 1; } } - // CJK characters - else if ( - c >= 0x3040 && c <= 0x309F || // Hiragana - c >= 0x30A0 && c <= 0x30FF || // Katakana - c >= 0x4E00 && c <= 0x9FFF || // Single CJK ideographs - c >= 0xF900 && c <= 0xFAFF || - c >= 0x3400 && c <= 0x4DBF - ) { + // full width characters + else if (isFullWidth(c)) { if (remaining >= 2) { remaining -= 2; } else { @@ -1292,6 +1274,41 @@ var EditSession = function(text, mode) { } return screenRows; } + + function isFullWidth(c) { + return c >= 0x1100 && c <= 0x115F || + c >= 0x11A3 && c <= 0x11A7 || + c >= 0x11FA && c <= 0x11FF || + c >= 0x2329 && c <= 0x232A || + c >= 0x2E80 && c <= 0x2E99 || + c >= 0x2E9B && c <= 0x2EF3 || + c >= 0x2F00 && c <= 0x2FD5 || + c >= 0x2FF0 && c <= 0x2FFB || + c >= 0x3000 && c <= 0x303E || + c >= 0x3041 && c <= 0x3096 || + c >= 0x3099 && c <= 0x30FF || + c >= 0x3105 && c <= 0x312D || + c >= 0x3131 && c <= 0x318E || + c >= 0x3190 && c <= 0x31BA || + c >= 0x31C0 && c <= 0x31E3 || + c >= 0x31F0 && c <= 0x321E || + c >= 0x3220 && c <= 0x3247 || + c >= 0x3250 && c <= 0x32FE || + c >= 0x3300 && c <= 0x4DBF || + c >= 0x4E00 && c <= 0xA48C || + c >= 0xA490 && c <= 0xA4C6 || + c >= 0xA960 && c <= 0xA97C || + c >= 0xAC00 && c <= 0xD7A3 || + c >= 0xD7B0 && c <= 0xD7C6 || + c >= 0xD7CB && c <= 0xD7FB || + c >= 0xF900 && c <= 0xFAFF || + c >= 0xFE10 && c <= 0xFE19 || + c >= 0xFE30 && c <= 0xFE52 || + c >= 0xFE54 && c <= 0xFE66 || + c >= 0xFE68 && c <= 0xFE6B || + c >= 0xFF01 && c <= 0xFF60 || + c >= 0xFFE0 && c <= 0xFFE6; + } }).call(EditSession.prototype);