Delete UTF-16 characters completely in editor
Previously, removing an UTF-16 character (such as emojis) required pressing the backspace twice. This was caused by ACE only handling single UTF-8 characters. Fixes CODEOCEAN-GC
This commit is contained in:
@ -333,12 +333,38 @@ var CodeOceanEditor = {
|
|||||||
editor.on("copy", this.handleCopyEvent.bind(element));
|
editor.on("copy", this.handleCopyEvent.bind(element));
|
||||||
|
|
||||||
// listener for autosave
|
// listener for autosave
|
||||||
session.on("change", function (deltaObject) {
|
session.on("change", function (deltaObject, session) {
|
||||||
|
// TODO: This is a workaround for a bug in Ace. Remove when upgrading Ace.
|
||||||
|
this.handleUTF16Surrogates(deltaObject, session);
|
||||||
this.resetSaveTimer();
|
this.resetSaveTimer();
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
handleUTF16Surrogates: function (AceDeltaObject, AceSession) {
|
||||||
|
if (AceDeltaObject.data === undefined || AceDeltaObject.data.action !== "removeText") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const codePoint = AceDeltaObject.data.text.codePointAt(0);
|
||||||
|
if (0xDC00 <= codePoint && codePoint <= 0xDFFF) {
|
||||||
|
// The text contains a UTF-16 surrogate pair, and the only the lower part is removed.
|
||||||
|
// We need to remove the high surrogate pair as well.
|
||||||
|
const currentCharacter = AceDeltaObject.data.range
|
||||||
|
const previousCharacter = {
|
||||||
|
start: {
|
||||||
|
row: currentCharacter.start.row,
|
||||||
|
column: currentCharacter.start.column - 1
|
||||||
|
},
|
||||||
|
end: {
|
||||||
|
row: currentCharacter.start.row,
|
||||||
|
column: currentCharacter.start.column
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AceSession.remove(previousCharacter);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
initializeEventHandlers: function () {
|
initializeEventHandlers: function () {
|
||||||
$(document).on('click', '#results a', this.showOutput.bind(this));
|
$(document).on('click', '#results a', this.showOutput.bind(this));
|
||||||
$(document).on('keydown', this.handleKeyPress.bind(this));
|
$(document).on('keydown', this.handleKeyPress.bind(this));
|
||||||
|
Reference in New Issue
Block a user