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;
|