@mkljczk/lexical-remark
Version:
This package contains Markdown helpers and functionality for Lexical using remark-parse.
101 lines (100 loc) • 3.12 kB
JavaScript
/* 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;
}