词法编辑器:在插入节点之前截取节点(剪贴板)

问题描述 投票:0回答:1

我正在使用一些 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;
}

我需要在节点插入选择之前拦截它们。例如。我想转换文本,以便所有

&nbsp;
都替换为
" "
。或者某些单词被替换为一些任意文本字符串等等。

执行此操作的正确方法是什么?

copy-paste lexicaljs
1个回答
0
投票

我现在正在另一个地方清理文本。

我用我的函数“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.
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.