Reemplace la palabra antes del cursor, cuando haya varias líneas en la edición

Quiero reemplazar la palabra antes del cursor en div contenteditable (vea también Detectar la última palabra escrita al escribir TAB en un área de texto o div contenteditable ).

El siguiente código:

  1. Funciona totalmente para el primer párrafo del div contenteditable
  2. no funciona para los siguientes párrafos del div contenteditable :

    IndexSizeError no capturado: no se pudo ejecutar ‘setStart’ en ‘Range’: el offset 71 es mayor que la longitud del nodo (38).

¿Cómo debo modificar el siguiente código para que funcione al presionar la tecla TAB en la segunda línea del div contenteditable ?

 document.addEventListener("keydown", function(e) { var elt = e.target; if (elt.isContentEditable) { if (e.keyCode == 9) { e.preventDefault(); elt.focus(); range = document.getSelection().getRangeAt(0).cloneRange(); range.collapse(true); range.setStart(elt, 0); var words = range.toString().trim().split(' '); var lastWord = words[words.length - 1]; if (lastWord) { var wordStart = range.toString().lastIndexOf(lastWord); var wordEnd = wordStart + lastWord.length; range.setStart(elt.firstChild, wordStart); range.setEnd(elt.firstChild, wordEnd); range.deleteContents(); document.execCommand('insertText', false, "hello\nnewline"); elt.normalize(); } } } }); 
 
Hello, click here and press TAB to replace this WORD
Also click here and press TAB after this ONE


Nota: Ya he probado la respuesta de Reemplazar palabra específica en contenteditable pero no funciona cuando hay varias líneas en la división contenteditable.

Esto funciona:

 document.addEventListener("keydown", function(e) { var elt = e.target; if (elt.isContentEditable) { if (e.keyCode == 9) { e.preventDefault(); elt.focus(); sel = document.getSelection(); sel.modify("extend", "backward", "word"); range = sel.getRangeAt(0); console.log(range.toString().trim()); range.deleteContents(); var el = document.createElement("div"); el.innerHTML = 'test and a link'; var frag = document.createDocumentFragment(), node; while (node = el.firstChild) { frag.appendChild(node); } range.insertNode(frag); range.collapse(); } } }); 
 
Hello, press TAB to replace this WORD
Also press TAB after this ONE