@cisstech/nge
Version:
NG Essentials is a collection of libraries for Angular developers.
60 lines • 8.26 kB
JavaScript
/**
* When a user type a composition key like ^ or \` the editor
* enter in composition mode, then after the user type any key the editor leave
* this composition mode an duplicate the character pressed by the user.
*
* This bug occurs only on some browsers like firefox and calling this method will prevent this behavior
* by removing any extra character added by the editor between 2 calls
* of `onDidCompositionStart` and `onDidCompositionEnd`
*/
export class PreventSymbolDuplication {
activate() {
this.disposable = monaco.editor.onDidCreateEditor((e) => {
this.preventSymbolDuplicationOnCompositionEnd(e);
});
}
deactivate() {
this.disposable?.dispose();
}
preventSymbolDuplicationOnCompositionEnd(editor) {
const positions = [];
let disposables = [];
disposables.push(editor.onDidCompositionStart(() => {
const position = editor.getPosition();
if (position) {
positions.push(position);
}
}));
disposables.push(editor.onDidCompositionEnd(() => {
setTimeout(() => {
if (!positions.length) {
return;
}
const before = positions[0];
const after = editor.getPosition();
if (!after) {
return;
}
positions.splice(0, 1);
const diff = after.column - before.column;
if (diff > 1) {
// unfocus the editor to leave composition
// mode because when the user type ` the editor
// leave the composition mode and begin another one
;
document.activeElement?.blur();
// focus the editor to let the user continue to edit the content
// of the editor
editor.focus();
const r = new monaco.Range(after.lineNumber, after.column - (diff - 1), after.lineNumber, after.column);
editor.executeEdits('api', [{ range: r, text: '', forceMoveMarkers: false }]);
}
});
}));
disposables.push(editor.onDidDispose(() => {
disposables.forEach((e) => e.dispose());
disposables = [];
}));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmVudC1zeW1ib2wtZHVwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ2UvbW9uYWNvL3NyYy9jb250cmlidXRpb25zL3ByZXZlbnQtc3ltYm9sLWR1cGxpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLHdCQUF3QjtJQUduQyxRQUFRO1FBQ04sSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDdEQsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xELENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFBO0lBQzVCLENBQUM7SUFFTyx3Q0FBd0MsQ0FBQyxNQUFpQztRQUNoRixNQUFNLFNBQVMsR0FBc0IsRUFBRSxDQUFBO1FBQ3ZDLElBQUksV0FBVyxHQUF5QixFQUFFLENBQUE7UUFDMUMsV0FBVyxDQUFDLElBQUksQ0FDZCxNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQTtZQUNyQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDMUIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUNILENBQUE7UUFDRCxXQUFXLENBQUMsSUFBSSxDQUNkLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUN0QixPQUFNO2dCQUNSLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUMzQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUE7Z0JBQ2xDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDWCxPQUFNO2dCQUNSLENBQUM7Z0JBRUQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7Z0JBQ3RCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQTtnQkFDekMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2IsMENBQTBDO29CQUMxQywrQ0FBK0M7b0JBQy9DLG1EQUFtRDtvQkFDbkQsQ0FBQztvQkFBQyxRQUFRLENBQUMsYUFBcUIsRUFBRSxJQUFJLEVBQUUsQ0FBQTtvQkFFeEMsZ0VBQWdFO29CQUNoRSxnQkFBZ0I7b0JBQ2hCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtvQkFFZCxNQUFNLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO29CQUN2RyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQTtnQkFDL0UsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQTtRQUNELFdBQVcsQ0FBQyxJQUFJLENBQ2QsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7WUFDdkIsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDdkMsV0FBVyxHQUFHLEVBQUUsQ0FBQTtRQUNsQixDQUFDLENBQUMsQ0FDSCxDQUFBO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdlTW9uYWNvQ29udHJpYnV0aW9uIH0gZnJvbSAnLi9tb25hY28tY29udHJpYnV0aW9uJ1xuXG4vKipcbiAqIFdoZW4gYSB1c2VyIHR5cGUgYSBjb21wb3NpdGlvbiBrZXkgbGlrZSBeIG9yIFxcYCB0aGUgZWRpdG9yXG4gKiBlbnRlciBpbiBjb21wb3NpdGlvbiBtb2RlLCB0aGVuIGFmdGVyIHRoZSB1c2VyIHR5cGUgYW55IGtleSB0aGUgZWRpdG9yIGxlYXZlXG4gKiB0aGlzIGNvbXBvc2l0aW9uIG1vZGUgYW4gZHVwbGljYXRlIHRoZSBjaGFyYWN0ZXIgcHJlc3NlZCBieSB0aGUgdXNlci5cbiAqXG4gKiBUaGlzIGJ1ZyBvY2N1cnMgb25seSBvbiBzb21lIGJyb3dzZXJzIGxpa2UgZmlyZWZveCBhbmQgY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHByZXZlbnQgdGhpcyBiZWhhdmlvclxuICogYnkgcmVtb3ZpbmcgYW55IGV4dHJhIGNoYXJhY3RlciBhZGRlZCBieSB0aGUgZWRpdG9yIGJldHdlZW4gMiBjYWxsc1xuICogb2YgYG9uRGlkQ29tcG9zaXRpb25TdGFydGAgYW5kIGBvbkRpZENvbXBvc2l0aW9uRW5kYFxuICovXG5leHBvcnQgY2xhc3MgUHJldmVudFN5bWJvbER1cGxpY2F0aW9uIGltcGxlbWVudHMgTmdlTW9uYWNvQ29udHJpYnV0aW9uIHtcbiAgcHJpdmF0ZSBkaXNwb3NhYmxlPzogbW9uYWNvLklEaXNwb3NhYmxlXG5cbiAgYWN0aXZhdGUoKSB7XG4gICAgdGhpcy5kaXNwb3NhYmxlID0gbW9uYWNvLmVkaXRvci5vbkRpZENyZWF0ZUVkaXRvcigoZSkgPT4ge1xuICAgICAgdGhpcy5wcmV2ZW50U3ltYm9sRHVwbGljYXRpb25PbkNvbXBvc2l0aW9uRW5kKGUpXG4gICAgfSlcbiAgfVxuXG4gIGRlYWN0aXZhdGUoKSB7XG4gICAgdGhpcy5kaXNwb3NhYmxlPy5kaXNwb3NlKClcbiAgfVxuXG4gIHByaXZhdGUgcHJldmVudFN5bWJvbER1cGxpY2F0aW9uT25Db21wb3NpdGlvbkVuZChlZGl0b3I6IG1vbmFjby5lZGl0b3IuSUNvZGVFZGl0b3IpIHtcbiAgICBjb25zdCBwb3NpdGlvbnM6IG1vbmFjby5Qb3NpdGlvbltdID0gW11cbiAgICBsZXQgZGlzcG9zYWJsZXM6IG1vbmFjby5JRGlzcG9zYWJsZVtdID0gW11cbiAgICBkaXNwb3NhYmxlcy5wdXNoKFxuICAgICAgZWRpdG9yLm9uRGlkQ29tcG9zaXRpb25TdGFydCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldFBvc2l0aW9uKClcbiAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgcG9zaXRpb25zLnB1c2gocG9zaXRpb24pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICAgIGRpc3Bvc2FibGVzLnB1c2goXG4gICAgICBlZGl0b3Iub25EaWRDb21wb3NpdGlvbkVuZCgoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghcG9zaXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IHBvc2l0aW9uc1swXVxuICAgICAgICAgIGNvbnN0IGFmdGVyID0gZWRpdG9yLmdldFBvc2l0aW9uKClcbiAgICAgICAgICBpZiAoIWFmdGVyKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwb3NpdGlvbnMuc3BsaWNlKDAsIDEpXG4gICAgICAgICAgY29uc3QgZGlmZiA9IGFmdGVyLmNvbHVtbiAtIGJlZm9yZS5jb2x1bW5cbiAgICAgICAgICBpZiAoZGlmZiA+IDEpIHtcbiAgICAgICAgICAgIC8vIHVuZm9jdXMgdGhlIGVkaXRvciB0byBsZWF2ZSBjb21wb3NpdGlvblxuICAgICAgICAgICAgLy8gbW9kZSBiZWNhdXNlIHdoZW4gdGhlIHVzZXIgdHlwZSBgIHRoZSBlZGl0b3JcbiAgICAgICAgICAgIC8vIGxlYXZlIHRoZSBjb21wb3NpdGlvbiBtb2RlIGFuZCBiZWdpbiBhbm90aGVyIG9uZVxuICAgICAgICAgICAgOyhkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIGFueSk/LmJsdXIoKVxuXG4gICAgICAgICAgICAvLyBmb2N1cyB0aGUgZWRpdG9yIHRvIGxldCB0aGUgdXNlciBjb250aW51ZSB0byBlZGl0IHRoZSBjb250ZW50XG4gICAgICAgICAgICAvLyBvZiB0aGUgZWRpdG9yXG4gICAgICAgICAgICBlZGl0b3IuZm9jdXMoKVxuXG4gICAgICAgICAgICBjb25zdCByID0gbmV3IG1vbmFjby5SYW5nZShhZnRlci5saW5lTnVtYmVyLCBhZnRlci5jb2x1bW4gLSAoZGlmZiAtIDEpLCBhZnRlci5saW5lTnVtYmVyLCBhZnRlci5jb2x1bW4pXG4gICAgICAgICAgICBlZGl0b3IuZXhlY3V0ZUVkaXRzKCdhcGknLCBbeyByYW5nZTogciwgdGV4dDogJycsIGZvcmNlTW92ZU1hcmtlcnM6IGZhbHNlIH1dKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgKVxuICAgIGRpc3Bvc2FibGVzLnB1c2goXG4gICAgICBlZGl0b3Iub25EaWREaXNwb3NlKCgpID0+IHtcbiAgICAgICAgZGlzcG9zYWJsZXMuZm9yRWFjaCgoZSkgPT4gZS5kaXNwb3NlKCkpXG4gICAgICAgIGRpc3Bvc2FibGVzID0gW11cbiAgICAgIH0pXG4gICAgKVxuICB9XG59XG4iXX0=