Feat:节点富文本编辑中,如果粘贴的是smm格式的数据,那么取出第一个节点的纯文本进行粘贴

This commit is contained in:
街角小林
2023-12-29 17:46:58 +08:00
parent c0fb1e8db8
commit 1409b07fb3
3 changed files with 60 additions and 22 deletions

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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)
}
}