From e919af6857c3802b49ff63ba345a6e6527038167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=A8=E9=9C=96=E9=93=83?= Date: Sat, 30 May 2026 21:01:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(qrcode):=20=E4=BF=AE=E5=A4=8D=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=8F=B3=E9=94=AE=E8=8F=9C=E5=8D=95=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E5=92=8C=E6=A3=80=E6=B5=8B=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改菜单标题为「解析图片二维码」更准确 - 改进 isImageUrl 函数,支持更多图片URL格式 - 支持 data:image/ 格式 - 支持URL路径中包含图片相关关键词 - 更新国际化文案和测试用例 --- public/_locales/zh/messages.json | 2 +- src/pages/QrCode/hooks/useQrCode.ts | 21 +++++++++++++++++++-- src/utils/__tests__/contextMenu.test.ts | 2 +- src/utils/contextMenu.ts | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/public/_locales/zh/messages.json b/public/_locales/zh/messages.json index 81dbbb0..bd41e3e 100644 --- a/public/_locales/zh/messages.json +++ b/public/_locales/zh/messages.json @@ -617,7 +617,7 @@ "description": "Translation key: qrCode_resultPlaceholder" }, "qrCode_imageToQr": { - "message": "图片转二维码", + "message": "解析图片二维码", "description": "Translation key: qrCode_imageToQr" }, "rightClickRestorer_loading": { diff --git a/src/pages/QrCode/hooks/useQrCode.ts b/src/pages/QrCode/hooks/useQrCode.ts index ed94977..a88b019 100644 --- a/src/pages/QrCode/hooks/useQrCode.ts +++ b/src/pages/QrCode/hooks/useQrCode.ts @@ -27,9 +27,26 @@ function isUrl(text: string): boolean { /** 检测URL是否为图片格式 */ function isImageUrl(url: string): boolean { + const trimmedUrl = url.trim().toLowerCase(); + + // 检查是否为 data:image 格式 + if (trimmedUrl.startsWith('data:image/')) { + return true; + } + + // 检查是否包含图片扩展名 const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg', '.ico']; - const lowerUrl = url.toLowerCase(); - return imageExtensions.some((ext) => lowerUrl.includes(ext)); + if (imageExtensions.some((ext) => trimmedUrl.includes(ext))) { + return true; + } + + // 检查URL路径中是否包含图片相关关键词 + const imageKeywords = ['/image/', '/img/', '/photo/', '/pic/', '/upload/']; + if (imageKeywords.some((keyword) => trimmedUrl.includes(keyword))) { + return true; + } + + return false; } /** 生成二维码的核心逻辑 */ diff --git a/src/utils/__tests__/contextMenu.test.ts b/src/utils/__tests__/contextMenu.test.ts index f4b34c1..071619b 100644 --- a/src/utils/__tests__/contextMenu.test.ts +++ b/src/utils/__tests__/contextMenu.test.ts @@ -50,7 +50,7 @@ describe('contextMenu', () => { ); expect(imageMenus).toHaveLength(1); expect(imageMenus[0].id).toBe('qrCode-image'); - expect(imageMenus[0].title).toBe('🖼️ 图片转二维码'); + expect(imageMenus[0].title).toBe('🖼️ 解析图片二维码'); }); }); diff --git a/src/utils/contextMenu.ts b/src/utils/contextMenu.ts index bde2e3b..f394619 100644 --- a/src/utils/contextMenu.ts +++ b/src/utils/contextMenu.ts @@ -80,7 +80,7 @@ export const CONTEXT_MENU_CONFIGS: ContextMenuItemConfig[] = [ }, { id: 'qrCode-image', - title: '🖼️ 图片转二维码', + title: '🖼️ 解析图片二维码', contexts: [chrome.contextMenus.ContextType.IMAGE], parentId: PARENT_MENU_ID, },