fix multi byte rendering (cursor position, selection)

This commit is contained in:
田 淼 2011-01-25 20:50:30 +08:00 • committed by Fabian Jakobs
commit 4e21d9edd8
5 changed files with 81 additions and 36 deletions

View file

@ -241,7 +241,7 @@ var EditSession = function(text, mode) {
};
this.tokenRe = /^[\w\d]+/g;
this.nonTokenRe = /^[^\w\d]+/g;
this.nonTokenRe = /^[^\w\d|\x00-\xff]+/g;
this.getWordRange = function(row, column) {
var line = this.getLine(row);
@ -633,19 +633,23 @@ var EditSession = function(text, mode) {
var screenColumn = 0;
var remaining = docColumn;
var line = this.getLine(row).split("\t");
for (var i=0; i<line.length; i++) {
var len = line[i].length;
if (remaining > len) {
remaining -= (len + 1);
screenColumn += len + tabSize;
}
else {
screenColumn += remaining;
break;
}
}
var line = this.getLine(row);
for(var i=0; i<line.length; i++){
var c = line[i];
if(remaining > 0){
remaining -= 1;
if(c == '\t'){
screenColumn += tabSize;
} else if(/[^\x00-\xff]/.exec(c)){
screenColumn += 2;
} else {
screenColumn += 1;
}
}else{
break;
}
}
return screenColumn;
};
@ -655,23 +659,24 @@ var EditSession = function(text, mode) {
var docColumn = 0;
var remaining = screenColumn;
var line = this.getLine(row).split("\t");
for (var i=0; i<line.length; i++) {
var len = line[i].length;
if (remaining >= len + tabSize) {
remaining -= (len + tabSize);
docColumn += (len + 1);
}
else if (remaining > len){
docColumn += len;
break;
}
else {
docColumn += remaining;
break;
}
}
var line = this.getLine(row);
for(var i=0; i<line.length; i++){
var c = line[i];
if(remaining > 0){
docColumn += 1;
if(c == '\t'){
remaining -= tabSize;
} else if(/[^\x00-\xff]/.exec(c)){
remaining -= 2;
} else {
remaining -= 1;
}
}else{
break;
}
}
return docColumn;
};

View file

@ -274,6 +274,17 @@ var Text = function(parentEl) {
.replace(/</g, "&lt;")
.replace(spaceRe, spaceReplace)
.replace(/\t/g, this.$tabString);
var buffer = '';
for (var j=0;j<output.length;j++){
var w = output.charAt(j);
if(/[^\x00-\xff]/.exec(w)){
buffer = buffer + "<span style='width: "+ this.config.characterWidth * 2 +"px; display: inline-block; text-align: center;'>" + w + "</span>";
}else{
buffer = buffer + w;
}
}
output = buffer;
if (!this.$textToken[token.type]) {
var classes = "ace_" + token.type.replace(/\./g, " ace_");

View file

@ -591,12 +591,35 @@ var VirtualRenderer = function(container, theme) {
};
this.showComposition = function(position) {
var cur = this.$cursorLayer.element.firstChild;
var scroll = this.scroller;
var top = (parseInt(cur.style.top) || 0) + (parseInt(scroll.style.top) || 0);
var left = (parseInt(cur.style.left) || 0) + (parseInt(scroll.style.left) || 0);
var edit = document.getElementById("editor").lastChild;
edit.style.color = '#66ff33';
edit.style.top = (top - 1) + "px";
edit.style.left = (left + 3) + "px";
edit.style.background = "transparent";
edit.style.border = "none";
edit.style.resize = "none";
edit.style.outline = "none";
edit.style.width = "10000px";
edit.style.height = "10000px";
edit.style.fontSize = "12px";
this.hideCursor();
};
this.setCompositionText = function(text) {
};
this.hideComposition = function() {
this.showCursor();
var edit = document.getElementById("editor").lastChild;
edit.className = '';
edit.style.top = "-10000px";
edit.style.left = "-10000px";
};
this.setTheme = function(theme) {