| import { Blot, Leaf } from './abstract/blot'; | 
| import LeafBlot from './abstract/leaf'; | 
| import * as Registry from '../registry'; | 
|   | 
| class TextBlot extends LeafBlot implements Leaf { | 
|   static blotName = 'text'; | 
|   static scope = Registry.Scope.INLINE_BLOT; | 
|   | 
|   public domNode!: Text; | 
|   protected text: string; | 
|   | 
|   static create(value: string): Text { | 
|     return document.createTextNode(value); | 
|   } | 
|   | 
|   static value(domNode: Text): string { | 
|     let text = domNode.data; | 
|     // @ts-ignore | 
|     if (text['normalize']) text = text['normalize'](); | 
|     return text; | 
|   } | 
|   | 
|   constructor(node: Node) { | 
|     super(node); | 
|     this.text = this.statics.value(this.domNode); | 
|   } | 
|   | 
|   deleteAt(index: number, length: number): void { | 
|     this.domNode.data = this.text = this.text.slice(0, index) + this.text.slice(index + length); | 
|   } | 
|   | 
|   index(node: Node, offset: number): number { | 
|     if (this.domNode === node) { | 
|       return offset; | 
|     } | 
|     return -1; | 
|   } | 
|   | 
|   insertAt(index: number, value: string, def?: any): void { | 
|     if (def == null) { | 
|       this.text = this.text.slice(0, index) + value + this.text.slice(index); | 
|       this.domNode.data = this.text; | 
|     } else { | 
|       super.insertAt(index, value, def); | 
|     } | 
|   } | 
|   | 
|   length(): number { | 
|     return this.text.length; | 
|   } | 
|   | 
|   optimize(context: { [key: string]: any }): void { | 
|     super.optimize(context); | 
|     this.text = this.statics.value(this.domNode); | 
|     if (this.text.length === 0) { | 
|       this.remove(); | 
|     } else if (this.next instanceof TextBlot && this.next.prev === this) { | 
|       this.insertAt(this.length(), (<TextBlot>this.next).value()); | 
|       this.next.remove(); | 
|     } | 
|   } | 
|   | 
|   position(index: number, inclusive: boolean = false): [Node, number] { | 
|     return [this.domNode, index]; | 
|   } | 
|   | 
|   split(index: number, force: boolean = false): Blot { | 
|     if (!force) { | 
|       if (index === 0) return this; | 
|       if (index === this.length()) return this.next; | 
|     } | 
|     let after = Registry.create(this.domNode.splitText(index)); | 
|     this.parent.insertBefore(after, this.next); | 
|     this.text = this.statics.value(this.domNode); | 
|     return after; | 
|   } | 
|   | 
|   update(mutations: MutationRecord[], context: { [key: string]: any }): void { | 
|     if ( | 
|       mutations.some(mutation => { | 
|         return mutation.type === 'characterData' && mutation.target === this.domNode; | 
|       }) | 
|     ) { | 
|       this.text = this.statics.value(this.domNode); | 
|     } | 
|   } | 
|   | 
|   value(): string { | 
|     return this.text; | 
|   } | 
| } | 
|   | 
| export default TextBlot; |