From 011e2ff37a91fd3cad0f7d3c3cc43d992bf7df98 Mon Sep 17 00:00:00 2001 From: cc <98377878+hicccc77@users.noreply.github.com> Date: Wed, 25 Mar 2026 20:09:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DAction=E6=89=93=E5=8C=85?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=B8=8E=E6=B8=B2=E6=9F=93=E5=B1=82=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 2 +- electron/main.ts | 74 +++++++++++++++++++++++++++-------- 2 files changed, 59 insertions(+), 17 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d35b621..da0a4fe 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -226,7 +226,7 @@ jobs: ## macOS 安装提示(未知来源) - 若打开时提示“来自未知开发者”或“无法验证开发者”,请到「系统设置 -> 隐私与安全性」中允许打开该应用。 - 如果仍被系统拦截,请在终端执行以下命令去除隔离标记: - - `xattr -dr com.apple.quarantine "/Applications/WeFlow.app"` + - xattr -rd com.apple.quarantine /Applications/WeFlow.app - 执行后重新打开 WeFlow。 > 如果某个平台链接暂时未生成,可进入完整发布页查看全部资源:$RELEASE_PAGE diff --git a/electron/main.ts b/electron/main.ts index 6ac7211..8e44cae 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -146,27 +146,67 @@ const normalizeReleaseNotes = (rawReleaseNotes: unknown): string => { if (!merged.trim()) return '' - const shouldStripReleaseSection = (headingRaw: string): boolean => { - const heading = headingRaw.trim().toLowerCase() - if (heading === '下载' || heading === 'download') return true + const normalizeHeadingText = (raw: string): string => { + return raw + .replace(/<[^>]*>/g, ' ') + .replace(/ /gi, ' ') + .replace(/&/gi, '&') + .replace(/</gi, '<') + .replace(/>/gi, '>') + .replace(/"/gi, '"') + .replace(/'/gi, '\'') + .replace(/'/gi, '\'') + .toLowerCase() + .replace(/[::]/g, '') + .replace(/\s+/g, '') + .trim() + } - const compactHeading = heading.replace(/\s+/g, '') - if (compactHeading.startsWith('macos安装提示')) return true - if (compactHeading.startsWith('mac安装提示')) return true + const shouldStripReleaseSection = (headingRaw: string): boolean => { + const heading = normalizeHeadingText(headingRaw) + if (!heading) return false + if (heading.startsWith('下载') || heading.startsWith('download')) return true + + if ((heading.includes('macos') || heading.startsWith('mac')) && heading.includes('安装提示')) return true return false } - // 兼容 electron-updater 直接返回 HTML 的场景 + // 兼容 electron-updater 直接返回 HTML 的场景(含 dir/anchor 等标签嵌套) const removeDownloadSectionFromHtml = (input: string): string => { - return input - .replace( - /]*>\s*(?:下载|download)\s*<\/h[1-6]>\s*[\s\S]*?(?=]*>\s*(?:mac\s*os|mac)\s*安装提示(?:\s*[((]\s*未知来源\s*[))])?\s*<\/h[1-6]>\s*[\s\S]*?(?=]*>([\s\S]*?)<\/h\1>/gi + const headings: Array<{ start: number; end: number; headingText: string }> = [] + let match: RegExpExecArray | null + + while ((match = headingPattern.exec(input)) !== null) { + const full = match[0] + headings.push({ + start: match.index, + end: match.index + full.length, + headingText: match[2] || '' + }) + } + + if (headings.length === 0) return input + + const rangesToRemove: Array<{ start: number; end: number }> = [] + for (let i = 0; i < headings.length; i += 1) { + const current = headings[i] + if (!shouldStripReleaseSection(current.headingText)) continue + + const nextStart = i + 1 < headings.length ? headings[i + 1].start : input.length + rangesToRemove.push({ start: current.start, end: nextStart }) + } + + if (rangesToRemove.length === 0) return input + + let output = '' + let cursor = 0 + for (const range of rangesToRemove) { + output += input.slice(cursor, range.start) + cursor = range.end + } + output += input.slice(cursor) + return output } // 兼容 Markdown 场景(Action 最终 release note 模板) @@ -195,6 +235,8 @@ const normalizeReleaseNotes = (rawReleaseNotes: unknown): string => { } const cleaned = removeDownloadSectionFromMarkdown(removeDownloadSectionFromHtml(merged)) + // 兜底:即使没有匹配到标题,也不在弹窗展示 macOS 隔离标记清理命令 + .replace(/^[ \t>*-]*`?\s*xattr\s+-[a-z]*d[a-z]*\s+com\.apple\.quarantine[^\n]*`?\s*$/gim, '') .replace(/\n{3,}/g, '\n\n') .trim()