+import {
+ DOMConversionMap,
+ DOMExportOutput,
+ EditorConfig,
+ ElementNode,
+ LexicalEditor,
+ LexicalNode,
+ SerializedElementNode
+} from "lexical";
+
+
+export class CaptionNode extends ElementNode {
+ static getType(): string {
+ return 'caption';
+ }
+
+ static clone(node: CaptionNode): CaptionNode {
+ return new CaptionNode(node.__key);
+ }
+
+ createDOM(_config: EditorConfig, _editor: LexicalEditor): HTMLElement {
+ return document.createElement('caption');
+ }
+
+ updateDOM(_prevNode: unknown, _dom: HTMLElement, _config: EditorConfig): boolean {
+ return false;
+ }
+
+ isParentRequired(): true {
+ return true;
+ }
+
+ canBeEmpty(): boolean {
+ return false;
+ }
+
+ exportJSON(): SerializedElementNode {
+ return {
+ ...super.exportJSON(),
+ type: 'caption',
+ version: 1,
+ };
+ }
+
+ insertDOMIntoParent(nodeDOM: HTMLElement, parentDOM: HTMLElement): boolean {
+ parentDOM.insertBefore(nodeDOM, parentDOM.firstChild);
+ return true;
+ }
+
+ static importJSON(serializedNode: SerializedElementNode): CaptionNode {
+ return $createCaptionNode();
+ }
+
+ static importDOM(): DOMConversionMap | null {
+ return {
+ caption: (node: Node) => ({
+ conversion(domNode: Node) {
+ return {
+ node: $createCaptionNode(),
+ }
+ },
+ priority: 0,
+ }),
+ };
+ }
+}
+
+export function $createCaptionNode(): CaptionNode {
+ return new CaptionNode();
+}
+
+export function $isCaptionNode(node: LexicalNode | null | undefined): node is CaptionNode {
+ return node instanceof CaptionNode;
+}
\ No newline at end of file