Skip to content

Issue 136

clean edited this page Oct 2, 2026 · 2 revisions

Issue #136:Diff 统一应用代码主题

背景、复现和根因

在运行中的真实组件页面同时展示 example.ts 文件预览与 Git patch。默认浅色 Catppuccin Latte 下,文件预览背景为 rgb(239, 241, 245)、有 19 个语法 token;Diff 背景仍为 rgb(251, 252, 254)、语法 token 为 0。证据为下方修复前截图。复现版本为上述基线。

CodeView 已解析代码主题、字体和字号,而 DiffViewer 的 Git patch 分支直接输出字符串,统一/分栏使用全局 --code、--text 和 --diff-*。完整文本分支也使用应用变量。PR/MR 的 PullRequestPatch 是另一套独立渲染器,同样没有接入主题和语法高亮。

实现

  1. useCodeTheme 复用既有 resolveCodeTheme 和 codeAppearanceStyle,文件预览、文本 Diff、PR/MR 文件和评论上下文共同订阅同一偏好。浅深色分别选择,字体/字号即时应用。
  2. 主题 CSS 仅施加于文本展示节点。图片 Diff、外围工具栏、应用主题不受影响。行号列随字号及最大行号调整宽度。
  3. 共享惰性加载的 Prism。Git patch 按文件和差异块分别还原旧/新侧文本,整块 tokenization 后分行,保留块内多行注释与字符串。多文件提交按文件路径切换语言;PR/MR 无文件头的 patch 使用条目或评论中的路径。
  4. 完整文本对比保留原库折叠、统一/分栏和行内差异;使用仅由可信 token 映射生成、对源文本转义的 HTML 适配器,让语法和行内标记共存。没有新增依赖。针对原库的实体二次解码行为,将源文本中的 & 隔离在独立安全 span 中;真实 renderWordDiff 回归确认 "/  等字面量及恶意标签文本不截断、不执行。
  5. 可导入 VS Code 的 diffEditor.insertedLineBackground、removedLineBackground、insertedTextBackground、removedTextBackground。未提供时用所选主题的 inserted/deleted 色与代码背景按 12%(整行)/26%(行内)混合。增删仍有 +/- 标记,普通代码保留语法色。
  6. 自定义主题新增可选 diff 字段,旧偏好无需迁移;损坏或缺失主题继续回退到对应 Catppuccin 默认值。未知语言、过大 patch(256 Ki 字符)及高亮异常保留纯文本。

验收标准与证据

  • 文件预览与文本 Diff 共享即时生效的主题:网页导入浅色、桌面导入深色,均比较实际背景、关键字、行号和字号;内置 Latte/Frappé/Macchiato/Mocha 均运行验证。
  • 统一、分栏、全屏、改动、提交历史单文件/全部文件、PR/MR 文件/评论渲染器接入;PR/MR 行号及 Shift 连续多行选择保留。
  • 浅深色及系统外观切换正确;自定义颜色、缺少 diff 色的回退、主题损坏/缺失的回退覆盖运行和单元测试。
  • 增删标记、语法色与行内标记保持,截图完成视觉核验。
  • 全新 Electron 进程从稳定 workspace 偏好恢复导入主题和字号;网页重新加载、文件切换和仓库 Diff 重新加载保持选择。
  • 本地与真实 SSH 数据流均通过;文件预览的滚动、选区、未知/大文件回退通过;图片 Diff 正常解码且没有代码主题属性。

验证记录

命令/场景 实际结果
npm run desktop:build 共享包、SSH、服务端、网页 TypeScript/Vite、Electron staging 均通过;原有大 bundle 提示保留
npm test -w web 226 项通过,含新增 6 项主题/patch/转义/持久化、Git 中文路径测试
npm run desktop:test:unit 45 项通过
npm run test:code-appearance -w desktop 本地及 SSH 的 TS/Python/JSON、未知/大文件、系统主题切换、行号、选区及滚动保持通过
npm run desktop:test:diff-theme 真实临时 Git + SSH,改动与历史、统一/分栏/全屏、图片、导入主题,以及第二次 Electron 进程启动通过
node apps/web/tests/diff-theme-server.cjs + 浏览器 生产 Nest 后端、SQLite、Git、本地/SSH 连接,使用设置 UI 导入主题并验证 Diff
Vite /tests/diff-theme-fixture.html + 浏览器 同页对照文件预览、Git patch、完整文本及 PR/MR 评论;折叠/行内标记、全屏/Esc、多行选择和主题切换

早期独立执行 Web 构建时尚未构建新工作树的 @alune/shared,报缺失依赖;改用根目录构建后通过。既有文件阅读验收最初被仓库“未配置远程”通知抢走选区,已修正测试先关闭通知,再验证 token DOM 身份、选区和滚动;本地/SSH 重跑通过。这两项不作为成功记录掩盖。网页验收期间重建 Vite 资源导致旧页请求的高亮 chunk 返回 404,页面保留主题和纯文本;刷新到最新构建后再次验证高亮和持久化通过。

命令结果摘录。

截图

修复前,同一 Latte 设置下预览与 Diff 背景、高亮不同:

修复前对比

修复后,Frappé 主题及 18px 字号:

修复后预览与 Diff

真实网页本地仓库的导入浅色主题:

网页本地仓库 网页 SSH 分栏

桌面 SSH 的导入深色主题:

桌面导入主题

全屏分栏及 PR/MR 多行选择:

全屏分栏 PR/MR 多行选择

完整文本对比中的语法与行内变化标记:

完整文本行内变化

限制与回退

Git patch 未携带的块外语法上下文无法恢复;兼容范围沿用 Prism 与既有 VS Code scope 映射。自定义主题自身提供的低对比颜色按原设置保留。Windows/Linux 没有做本次桌面人工视觉验收;本次实际桌面系统为 macOS arm64。SSH 为本机启动的真实 SSH/SFTP 服务,不是外部生产服务器。PR/MR 验收使用本地 fixture,不向外部托管平台提交评论。

代码可通过 revert 本 PR 回退;Wiki 独立维护。主仓库只保存运行说明及可复跑测试,截图和验收记录保存在本页。

Clone this wiki locally