From 1409b07fb3201c235e6f1bd2ddc648b9bbec84b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A1=97=E8=A7=92=E5=B0=8F=E6=9E=97?= <1013335014@qq.com> Date: Fri, 29 Dec 2023 17:46:58 +0800 Subject: [PATCH] =?UTF-8?q?Feat=EF=BC=9A=E8=8A=82=E7=82=B9=E5=AF=8C?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E7=BC=96=E8=BE=91=E4=B8=AD=EF=BC=8C=E5=A6=82?= =?UTF-8?q?=E6=9E=9C=E7=B2=98=E8=B4=B4=E7=9A=84=E6=98=AFsmm=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E7=9A=84=E6=95=B0=E6=8D=AE=EF=BC=8C=E9=82=A3=E4=B9=88?= =?UTF-8?q?=E5=8F=96=E5=87=BA=E7=AC=AC=E4=B8=80=E4=B8=AA=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E7=9A=84=E7=BA=AF=E6=96=87=E6=9C=AC=E8=BF=9B=E8=A1=8C=E7=B2=98?= =?UTF-8?q?=E8=B4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple-mind-map/src/core/render/Render.js | 33 ++++++++++------------- simple-mind-map/src/plugins/RichText.js | 18 ++++++++++--- simple-mind-map/src/utils/index.js | 31 +++++++++++++++++++++ 3 files changed, 60 insertions(+), 22 deletions(-) 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) + } +}