UNPKG

@mkljczk/lexical-remark

Version:

This package contains Markdown helpers and functionality for Lexical using remark-parse.

101 lines (100 loc) 3.12 kB
/* eslint-disable @typescript-eslint/no-use-before-define */ import { $createParagraphNode, $isElementNode, ElementNode, } from 'lexical'; import { $isCollapsibleContainerNode } from '../container/node.js'; import { $isCollapsibleContentNode } from '../content/node.js'; export function convertSummaryElement(domNode) { const node = $createCollapsibleTitleNode(); return { node, }; } /** * A Lexical node to represent an HTML summary element */ export class CollapsibleTitleNode extends ElementNode { static getType() { return 'collapsible-title'; } static clone(node) { return new CollapsibleTitleNode(node.__key); } createDOM(config, editor) { const dom = document.createElement('summary'); dom.classList.add('Collapsible__title'); return dom; } updateDOM(prevNode, dom) { return false; } static importDOM() { return { summary: (domNode) => { return { conversion: convertSummaryElement, priority: 1, }; }, }; } static importJSON(serializedNode) { return $createCollapsibleTitleNode(); } exportDOM() { const element = document.createElement('summary'); return { element }; } exportJSON() { return { ...super.exportJSON(), type: 'collapsible-title', version: 1, }; } collapseAtStart(_selection) { this.getParentOrThrow().insertBefore(this); return true; } insertNewAfter(_, restoreSelection = true) { const containerNode = this.getParentOrThrow(); if (!$isCollapsibleContainerNode(containerNode)) { throw new Error('CollapsibleTitleNode expects to be child of CollapsibleContainerNode'); } if (containerNode.getOpen()) { const contentNode = this.getNextSibling(); if (!$isCollapsibleContentNode(contentNode)) { throw new Error('CollapsibleTitleNode expects to have CollapsibleContentNode sibling'); } const firstChild = contentNode.getFirstChild(); if ($isElementNode(firstChild)) { return firstChild; } else { const paragraph = $createParagraphNode(); contentNode.append(paragraph); return paragraph; } } else { const paragraph = $createParagraphNode(); containerNode.insertAfter(paragraph, restoreSelection); return paragraph; } } } /** * Creates a Collapsible Title node * * @returns A Collapsible Title node */ export function $createCollapsibleTitleNode() { return new CollapsibleTitleNode(); } /** * A typeguard function to assert on a Collapsible Title node * * @param node A Lexical node * @returns true if the node is a Collapsible Title node, otherwise false */ export function $isCollapsibleTitleNode(node) { return node instanceof CollapsibleTitleNode; }