You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Tiptap v1粘贴纯文本时的换行转换规则?

Tiptap v1 纯文本粘贴换行规则自定义解决方案

核心实现

通过重写clipboardTextParser自定义纯文本解析逻辑即可实现需求,完整配置示例如下:

import { Editor } from 'tiptap'
import { Slice, Fragment } from 'prosemirror-model'
// 如需使用HardBreak,提前引入扩展
// import { HardBreak } from 'tiptap-extensions'

new Editor({
  // 你原有其他配置,比如extensions、content等
  // extensions: [new HardBreak(), ...其他扩展],
  editorProps: {
    clipboardTextParser(text, $context) {
      // 从上下文获取当前编辑器的schema
      const schema = $context.doc.type.schema
      const paragraphNode = schema.nodes.paragraph
      const hardBreakNode = schema.nodes.hard_break

      // 按连续2个及以上换行拆分段落,实现双换行分段
      const paragraphList = text.split(/(?:\r?\n){2,}/)
      const outputNodes = []

      paragraphList.forEach(paraContent => {
        // 可根据需求调整是否跳过空段落
        if (!paraContent.trim()) return

        const lineList = paraContent.split(/\r?\n/)
        const paraNodes = []
        lineList.forEach((line, index) => {
          // 插入当前行文本
          if (line) {
            paraNodes.push(schema.text(line))
          }
          // 非末尾行插入br节点,实现单换行转<br>
          if (index !== lineList.length - 1) {
            paraNodes.push(hardBreakNode.create())
          }
        })

        // 包装为段落节点加入输出列表
        outputNodes.push(paragraphNode.create(null, paraNodes))
      })

      // 返回ProseMirror要求的Slice格式数据
      return new Slice(Fragment.from(outputNodes), 0, 0)
    }
  }
})

注意事项

  • 需确保已在扩展列表中引入HardBreak扩展,否则硬换行节点无法正常生成
  • 该方法仅处理纯文本粘贴场景,带格式的HTML粘贴走ProseMirror独立的剪贴板解析逻辑,不受影响
  • 如需保留首尾空行,删除if (!paraContent.trim()) return的空段落过滤逻辑即可

内容的提问来源于stack exchange,提问作者sonick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:09:02