我正在使用一些 Lexial 插件来增强复制/粘贴体验 (CopyPasteEnhancementPlugin)。
在研究它的工作原理时,我在 Clipboard.ts 中发现了这个辅助函数。每次用户将一些内容粘贴到 Lexical 中时都会调用该函数:
export function $insertGeneratedNodes(
editor: LexicalEditor,
nodes: Array<LexicalNode>,
selection: BaseSelection,
): void {
if (
!editor.dispatchCommand(SELECTION_INSERT_CLIPBOARD_NODES_COMMAND, {
nodes,
selection,
})
) {
selection.insertNodes(nodes);
}
return;
}
我需要在节点插入选择之前拦截它们。例如。我想转换文本,以便所有
都替换为 " "
。或者某些单词被替换为一些任意文本字符串等等。
执行此操作的正确方法是什么?
我现在正在另一个地方清理文本。
我用我的函数“traverseAndCleanup”连接到 Clipboard.ts 中“...”之后的代码:
/**
* Traverses the DOM from a root node and cleans up the text content of all text nodes.
*
* @param node a DOM node
*/
const traverseAndCleanup = (node: Node):void => {
if (node.nodeType === Node.TEXT_NODE) {
if (node.nodeValue) {
node.nodeValue = cleanup(node.nodeValue);
}
}
node.childNodes.forEach(child => traverseAndCleanup(child));
}
....
if (htmlString) {
try {
const parser = new DOMParser();
const dom = parser.parseFromString(htmlString, 'text/html');
traverseAndCleanup(dom);
const nodes = $generateNodesFromDOM(editor, dom);
return $insertGeneratedNodes(editor, nodes, selection);
} catch {
// Fail silently.
}
}