@mdxeditor/editor
Version:
React component for rich text markdown editing
44 lines (43 loc) • 1.61 kB
JavaScript
import { $isListItemNode, $isListNode } from "@lexical/list";
import { $isTextNode, $isLineBreakNode, $isElementNode, $isDecoratorNode } from "lexical";
const LexicalListItemVisitor = {
testLexicalNode: $isListItemNode,
visitLexicalNode: ({ lexicalNode, mdastParent, actions }) => {
const children = lexicalNode.getChildren();
const firstChild = children[0];
if (children.length === 1 && $isListNode(firstChild)) {
const prevListItemNode = mdastParent.children.at(-1);
if (!prevListItemNode) {
actions.visitChildren(firstChild, mdastParent);
} else {
actions.visitChildren(lexicalNode, prevListItemNode);
}
} else {
const parentList = lexicalNode.getParent();
const listItem = actions.appendToParent(mdastParent, {
type: "listItem",
checked: parentList.getListType() === "check" ? Boolean(lexicalNode.getChecked()) : void 0,
spread: false,
children: []
});
let surroundingParagraph = null;
for (const child of lexicalNode.getChildren()) {
if ($isTextNode(child) || $isLineBreakNode(child) || child.isInline() && ($isElementNode(child) || $isDecoratorNode(child))) {
if (!surroundingParagraph) {
surroundingParagraph = actions.appendToParent(listItem, {
type: "paragraph",
children: []
});
}
actions.visit(child, surroundingParagraph);
} else {
surroundingParagraph = null;
actions.visit(child, listItem);
}
}
}
}
};
export {
LexicalListItemVisitor
};