1 import {$getRoot, $isTextNode, LexicalEditor, LexicalNode} from "lexical";
2 import {LexicalNodeMatcher} from "../nodes";
3 import {$createCustomParagraphNode} from "../nodes/custom-paragraph";
4 import {$generateNodesFromDOM} from "@lexical/html";
5 import {htmlToDom} from "./dom";
7 function wrapTextNodes(nodes: LexicalNode[]): LexicalNode[] {
8 return nodes.map(node => {
9 if ($isTextNode(node)) {
10 const paragraph = $createCustomParagraphNode();
11 paragraph.append(node);
18 export function $htmlToBlockNodes(editor: LexicalEditor, html: string): LexicalNode[] {
19 const dom = htmlToDom(html);
20 const nodes = $generateNodesFromDOM(editor, dom);
21 return wrapTextNodes(nodes);
24 export function $getParentOfType(node: LexicalNode, matcher: LexicalNodeMatcher): LexicalNode | null {
25 for (const parent of node.getParents()) {
26 if (matcher(parent)) {
35 * Get the nearest root/block level node for the given position.
37 export function $getNearestBlockNodeForCoords(editor: LexicalEditor, x: number, y: number): LexicalNode | null {
38 // TODO - Take into account x for floated blocks?
39 const rootNodes = $getRoot().getChildren();
40 for (const node of rootNodes) {
41 const nodeDom = editor.getElementByKey(node.__key);
46 const bounds = nodeDom.getBoundingClientRect();
47 if (y <= bounds.bottom) {