如何修改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
相关产品推荐
相关产品推荐

