diff --git a/ckeditor.html b/ckeditor.html index 4cab0ce..e123264 100644 --- a/ckeditor.html +++ b/ckeditor.html @@ -13,9 +13,13 @@ diff --git a/online-editor.js b/online-editor.js index baef5ac..1e332c7 100644 --- a/online-editor.js +++ b/online-editor.js @@ -11,7 +11,9 @@ class BesEditor { this.correctionPanel = correctionPanel this.scrollPanel = scrollPanel this.offsetTop = null + // TODO: consider simplfing ckeditor handling by using a single constructor parameter this.isCKeditor = !!isCkeditor + this.CKEditorInstance = isCkeditor edit.classList.add('bes-online-editor') this.originalSpellcheck = edit.spellcheck edit.spellcheck = false @@ -169,7 +171,7 @@ class BesEditor { }) this.markProofed(el, matches) - // This is a solution for CKEditor. It is not the best solution, but it works for now. + // This is a solution for displaying mistakes in CKEditor. It is not the best solution, but it works for now. if (this.isCKeditor) { const resizeEvent = new Event('resize') window.dispatchEvent(resizeEvent) @@ -283,7 +285,7 @@ class BesEditor { if (!child) return child.isProofed = false child.matches.forEach(match => { - match.highlights.forEach(h => h.remove()) + match?.highlights.forEach(h => h.remove()) delete match.highlights }) } @@ -487,7 +489,10 @@ class BesEditor { */ static findParent(el) { for (; el; el = el.parentNode) { - if (el.classList?.contains('bes-online-editor')) { + if ( + el.classList?.contains('bes-online-editor') || + el.classList?.contains('ck-editor__editable') // Find a better way to handle CKEditor + ) { return el } } @@ -503,9 +508,7 @@ class BesEditor { */ renderPopup(el, clientX, clientY) { const popup = document.querySelector('bes-popup-el') - const matches = this.children.find( - child => child.elements === el - )?.matches + const matches = this.children.find(child => child.elements === el)?.matches if (matches) { for (let m of matches) { if (m.rects) { @@ -541,6 +544,21 @@ class BesEditor { replacement + text.substring(match.offset + match.length) el.textContent = newText + if (editor.isCKeditor) { + const { CKEditorInstance } = editor + CKEditorInstance.model.change(writer => { + // Find the corresponding element in the model. + const viewElement = + CKEditorInstance.editing.view.domConverter.mapDomToView(el) + const modelElement = + CKEditorInstance.editing.mapper.toModelElement(viewElement) + + if (modelElement) { + writer.remove(writer.createRangeIn(modelElement)) + writer.insertText(newText, modelElement, 'end') + } + }) + } BesEditor.clearSingleMistake(editor, el, rect) // In my opinion, this approach provides the most straightforward solution for repositioning mistakes after a change. // It maintains reasonable performance as it only checks the block element that has been modified, @@ -615,12 +633,6 @@ window.onload = () => { document .querySelectorAll('.bes-online-editor') .forEach(edit => BesEditor.register(edit)) - - // TODO: not the most optimal solution, but it works for now - // Find contenteditable element inside ckeditor and prepare it - document.querySelectorAll('.ck-editor__editable').forEach(edit => { - BesEditor.register(edit, true) - }) } window.onresize = () => {