From 4d9471e582048a1e32782b6a7211d83f8742e58f Mon Sep 17 00:00:00 2001 From: zxc <1171051090@qq.com> Date: Sun, 18 Aug 2024 09:40:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=B2=98=E8=B4=B4=E8=B6=85=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E3=80=81=E5=9B=BE=E7=89=87=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/usePasteTextClipboardData.ts | 33 ++++++++++++++++++++------ src/utils/common.ts | 14 +++++++++++ src/views/Editor/CanvasTool/index.vue | 2 +- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/hooks/usePasteTextClipboardData.ts b/src/hooks/usePasteTextClipboardData.ts index d526198d..43011a85 100644 --- a/src/hooks/usePasteTextClipboardData.ts +++ b/src/hooks/usePasteTextClipboardData.ts @@ -1,6 +1,9 @@ +import { storeToRefs } from 'pinia' +import { useKeyboardStore } from '@/store' import { pasteCustomClipboardString } from '@/utils/clipboard' import { parseText2Paragraphs } from '@/utils/textParser' import { getImageDataURL, isSVGString, svg2File } from '@/utils/image' +import { isValidImgURL, isValidURL } from '@/utils/common' import useCreateElement from '@/hooks/useCreateElement' import useAddSlidesOrElements from '@/hooks/useAddSlidesOrElements' @@ -10,6 +13,8 @@ interface PasteTextClipboardDataOptions { } export default () => { + const { shiftKeyState } = storeToRefs(useKeyboardStore()) + const { createTextElement, createImageElement } = useCreateElement() const { addElementsFromData, addSlidesFromData } = useAddSlidesOrElements() @@ -47,17 +52,31 @@ export default () => { // 普通文本 else if (!onlyElements && !onlySlide) { - // 尝试检查是否为SVG代码 - const isSVG = isSVGString(clipboardData) - if (isSVG) { - const file = svg2File(clipboardData) - getImageDataURL(file).then(dataURL => createImageElement(dataURL)) - } // 普通文字 - else { + if (shiftKeyState.value) { const string = parseText2Paragraphs(clipboardData) createTextElementFromClipboard(string) } + else { + // 尝试检查是否为图片地址链接 + if (isValidImgURL(clipboardData)) { + createImageElement(clipboardData) + } + // 尝试检查是否为超链接 + else if (isValidURL(clipboardData)) { + createTextElementFromClipboard(`${clipboardData}`) + } + // 尝试检查是否为SVG代码 + else if (isSVGString(clipboardData)) { + const file = svg2File(clipboardData) + getImageDataURL(file).then(dataURL => createImageElement(dataURL)) + } + // 普通文字 + else { + const string = parseText2Paragraphs(clipboardData) + createTextElementFromClipboard(string) + } + } } } diff --git a/src/utils/common.ts b/src/utils/common.ts index d2260c53..ff6ac440 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -14,4 +14,18 @@ export const fillDigit = (digit: number, len: number) => { */ export const isPC = () => { return !navigator.userAgent.match(/(iPhone|iPod|iPad|Android|Mobile|BlackBerry|Symbian|Windows Phone)/i) +} + +/** + * 判断URL字符串 + */ +export const isValidURL = (url: string) => { + return /^(https?:\/\/)([\w-]+\.)+[\w-]{2,}(\/[\w-./?%&=]*)?$/i.test(url) +} + +/** + * 判断图片URL字符串 + */ +export const isValidImgURL = (url: string) => { + return /^(https?:\/\/)([\w-]+\.)+[\w-]{2,}(\/[\w-./?%&=]*)?\.(jpg|jpeg|png|svg|webp)(\?.*)?$/i.test(url) } \ No newline at end of file diff --git a/src/views/Editor/CanvasTool/index.vue b/src/views/Editor/CanvasTool/index.vue index 52d8874d..7e3adce3 100644 --- a/src/views/Editor/CanvasTool/index.vue +++ b/src/views/Editor/CanvasTool/index.vue @@ -255,7 +255,7 @@ const toggleNotesPanel = () => { &.group-btn { width: auto; - margin-right: 4px; + margin-right: 5px; &:hover { background-color: #f3f3f3;