| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 | import Parchment from 'parchment';import TextBlot from './text';const GUARD_TEXT = "\uFEFF";class Embed extends Parchment.Embed {  constructor(node) {    super(node);    this.contentNode = document.createElement('span');    this.contentNode.setAttribute('contenteditable', false);    [].slice.call(this.domNode.childNodes).forEach((childNode) => {      this.contentNode.appendChild(childNode);    });    this.leftGuard = document.createTextNode(GUARD_TEXT);    this.rightGuard = document.createTextNode(GUARD_TEXT);    this.domNode.appendChild(this.leftGuard);    this.domNode.appendChild(this.contentNode);    this.domNode.appendChild(this.rightGuard);  }  index(node, offset) {    if (node === this.leftGuard) return 0;    if (node === this.rightGuard) return 1;    return super.index(node, offset);  }  restore(node) {    let range, textNode;    let text = node.data.split(GUARD_TEXT).join('');    if (node === this.leftGuard) {      if (this.prev instanceof TextBlot) {        let prevLength = this.prev.length();        this.prev.insertAt(prevLength, text);        range = {          startNode: this.prev.domNode,          startOffset: prevLength + text.length        };      } else {        textNode = document.createTextNode(text);        this.parent.insertBefore(Parchment.create(textNode), this);        range = {          startNode: textNode,          startOffset: text.length        };      }    } else if (node === this.rightGuard) {      if (this.next instanceof TextBlot) {        this.next.insertAt(0, text);        range = {          startNode: this.next.domNode,          startOffset: text.length        }      } else {        textNode = document.createTextNode(text);        this.parent.insertBefore(Parchment.create(textNode), this.next);        range = {          startNode: textNode,          startOffset: text.length        };      }    }    node.data = GUARD_TEXT;    return range;  }  update(mutations, context) {    mutations.forEach((mutation) => {      if (mutation.type === 'characterData' &&          (mutation.target === this.leftGuard || mutation.target === this.rightGuard)) {        let range = this.restore(mutation.target);        if (range) context.range = range;      }    });  }}export default Embed;
 |