diff --git a/simple-mind-map/src/core/render/Render.js b/simple-mind-map/src/core/render/Render.js index 25c10d7a..01266d3f 100644 --- a/simple-mind-map/src/core/render/Render.js +++ b/simple-mind-map/src/core/render/Render.js @@ -26,7 +26,9 @@ import { getDataFromClipboard, htmlEscape, parseAddGeneralizationNodeList, - checkNodeListIsEqual + checkNodeListIsEqual, + createSmmFormatData, + checkSmmFormatData } from '../../utils' import { shapeList } from './node/Shape' import { lineStyleProps } from '../../themes/default' @@ -876,20 +878,14 @@ class Render { copy() { this.beingCopyData = this.copyNode() if (!this.beingCopyData) return - setDataToClipboard({ - simpleMindMap: true, - data: this.beingCopyData - }) + setDataToClipboard(createSmmFormatData(this.beingCopyData)) } // 剪切节点 cut() { this.mindMap.execCommand('CUT_NODE', copyData => { this.beingCopyData = copyData - setDataToClipboard({ - simpleMindMap: true, - data: copyData - }) + setDataToClipboard(createSmmFormatData(copyData)) }) } @@ -936,10 +932,11 @@ class Render { const res = await this.mindMap.opt.customHandleClipboardText(text) if (!isUndef(res)) { useDefault = false - if (typeof res === 'object' && res.simpleMindMap) { - smmData = res.data + const checkRes = checkSmmFormatData(res) + if (checkRes.isSmm) { + smmData = checkRes.data } else { - text = String(res) + text = checkRes.data } } } catch (error) { @@ -948,13 +945,11 @@ class Render { } // 默认处理 if (useDefault) { - try { - const parsedData = JSON.parse(text) - if (parsedData && parsedData.simpleMindMap) { - smmData = parsedData.data - } - } catch (error) { - errorHandler(ERROR_TYPES.PARSE_PASTE_DATA_ERROR, error) + const checkRes = checkSmmFormatData(text) + if (checkRes.isSmm) { + smmData = checkRes.data + } else { + text = checkRes.data } } if (smmData) { diff --git a/simple-mind-map/src/plugins/RichText.js b/simple-mind-map/src/plugins/RichText.js index 92dfd723..156f39c5 100644 --- a/simple-mind-map/src/plugins/RichText.js +++ b/simple-mind-map/src/plugins/RichText.js @@ -6,7 +6,8 @@ import { getTextFromHtml, isWhite, getVisibleColorFromTheme, - isUndef + isUndef, + checkSmmFormatData } from '../utils' import { CONSTANTS } from '../constants/constant' @@ -397,7 +398,7 @@ class RichText { // 拦截粘贴,只允许粘贴纯文本 this.quill.clipboard.addMatcher(Node.TEXT_NODE, node => { let style = this.getPasteTextStyle() - return new Delta().insert(node.data, style) + return new Delta().insert(this.formatPasteText(node.data), style) }) this.quill.clipboard.addMatcher(Node.ELEMENT_NODE, (node, delta) => { let ops = [] @@ -407,7 +408,7 @@ class RichText { if (op.insert && typeof op.insert === 'string' && op.insert !== '\n') { ops.push({ attributes: { ...style }, - insert: op.insert + insert: this.formatPasteText(op.insert) }) } }) @@ -428,6 +429,17 @@ class RichText { return {} } + // 处理粘贴的文本内容 + formatPasteText(text) { + const { isSmm, data } = checkSmmFormatData(text) + if (isSmm && data[0] && data[0].data) { + // 只取第一个节点的纯文本 + return getTextFromHtml(data[0].data.text) + } else { + return text + } + } + // 正则输入中文 onCompositionStart() { if (!this.showTextEdit) { diff --git a/simple-mind-map/src/utils/index.js b/simple-mind-map/src/utils/index.js index b0f3ebec..6417e79d 100644 --- a/simple-mind-map/src/utils/index.js +++ b/simple-mind-map/src/utils/index.js @@ -1027,3 +1027,34 @@ export const getChromeVersion = () => { } return '' } + +// 创建smm粘贴的粘贴数据 +export const createSmmFormatData = data => { + return { + simpleMindMap: true, + data + } +} + +// 检查是否是smm粘贴格式的数据 +export const checkSmmFormatData = data => { + let smmData = null + // 如果是字符串,则尝试解析为对象 + if (typeof data === 'string') { + try { + const parsedData = JSON.parse(data) + // 判断是否是对象,且存在属性标志 + if (typeof parsedData === 'object' && parsedData.simpleMindMap) { + smmData = parsedData.data + } + } catch (error) {} + } else if (typeof data === 'object' && data.simpleMindMap) { + // 否则如果是对象,则检查属性标志 + smmData = data.data + } + const isSmm = !!smmData + return { + isSmm, + data: isSmm ? smmData : String(data) + } +}