You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					80 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					80 lines
				
				2.3 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								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;
							 |