92 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
import {
 | 
						|
    DOMConversion,
 | 
						|
    DOMConversionMap, DOMConversionOutput,
 | 
						|
    ElementNode,
 | 
						|
    LexicalEditor,
 | 
						|
    LexicalNode,
 | 
						|
    SerializedElementNode, Spread,
 | 
						|
} from 'lexical';
 | 
						|
import type {EditorConfig} from "lexical/LexicalEditor";
 | 
						|
 | 
						|
export type SerializedHorizontalRuleNode = Spread<{
 | 
						|
    id: string;
 | 
						|
}, SerializedElementNode>
 | 
						|
 | 
						|
export class HorizontalRuleNode extends ElementNode {
 | 
						|
    __id: string = '';
 | 
						|
 | 
						|
    static getType() {
 | 
						|
        return 'horizontal-rule';
 | 
						|
    }
 | 
						|
 | 
						|
    setId(id: string) {
 | 
						|
        const self = this.getWritable();
 | 
						|
        self.__id = id;
 | 
						|
    }
 | 
						|
 | 
						|
    getId(): string {
 | 
						|
        const self = this.getLatest();
 | 
						|
        return self.__id;
 | 
						|
    }
 | 
						|
 | 
						|
    static clone(node: HorizontalRuleNode): HorizontalRuleNode {
 | 
						|
        const newNode = new HorizontalRuleNode(node.__key);
 | 
						|
        newNode.__id = node.__id;
 | 
						|
        return newNode;
 | 
						|
    }
 | 
						|
 | 
						|
    createDOM(_config: EditorConfig, _editor: LexicalEditor): HTMLElement {
 | 
						|
        const el = document.createElement('hr');
 | 
						|
        if (this.__id) {
 | 
						|
            el.setAttribute('id', this.__id);
 | 
						|
        }
 | 
						|
 | 
						|
        return el;
 | 
						|
    }
 | 
						|
 | 
						|
    updateDOM(prevNode: HorizontalRuleNode, dom: HTMLElement) {
 | 
						|
        return prevNode.__id !== this.__id;
 | 
						|
    }
 | 
						|
 | 
						|
    static importDOM(): DOMConversionMap|null {
 | 
						|
        return {
 | 
						|
            hr(node: HTMLElement): DOMConversion|null {
 | 
						|
                return {
 | 
						|
                    conversion: (element: HTMLElement): DOMConversionOutput|null => {
 | 
						|
                        const node = new HorizontalRuleNode();
 | 
						|
                        if (element.id) {
 | 
						|
                            node.setId(element.id);
 | 
						|
                        }
 | 
						|
 | 
						|
                        return {node};
 | 
						|
                    },
 | 
						|
                    priority: 3,
 | 
						|
                };
 | 
						|
            },
 | 
						|
        };
 | 
						|
    }
 | 
						|
 | 
						|
    exportJSON(): SerializedHorizontalRuleNode {
 | 
						|
        return {
 | 
						|
            ...super.exportJSON(),
 | 
						|
            type: 'horizontal-rule',
 | 
						|
            version: 1,
 | 
						|
            id: this.__id,
 | 
						|
        };
 | 
						|
    }
 | 
						|
 | 
						|
    static importJSON(serializedNode: SerializedHorizontalRuleNode): HorizontalRuleNode {
 | 
						|
        const node = $createHorizontalRuleNode();
 | 
						|
        node.setId(serializedNode.id);
 | 
						|
        return node;
 | 
						|
    }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
export function $createHorizontalRuleNode(): HorizontalRuleNode {
 | 
						|
    return new HorizontalRuleNode();
 | 
						|
}
 | 
						|
 | 
						|
export function $isHorizontalRuleNode(node: LexicalNode | null | undefined): node is HorizontalRuleNode {
 | 
						|
    return node instanceof HorizontalRuleNode;
 | 
						|
} |