UNPKG

@cisstech/nge

Version:

NG Essentials is a collection of libraries for Angular developers.

60 lines 8.26 kB
/** * 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=