From 9302d02cf5088a49215b3625cf98b9e0a315fa3b Mon Sep 17 00:00:00 2001 From: Menghuan1918 Date: Sun, 6 Sep 2026 23:48:25 +0800 Subject: [PATCH] refactor(changes): bring the PDF render toggle in line with the pane conventions Escape the .pdf extension in the op-target regex (the unescaped /.pdf$/ matched any path ending in pdf) and fold the copy-pasted toggle button into PaneToggle; record the sixth deliverable in the design doc. --- .../plans/2026-09-06-changes-op-previews-design.md | 8 ++++++-- src/client/changes/DiffPane.tsx | 14 +++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/plans/2026-09-06-changes-op-previews-design.md b/docs/plans/2026-09-06-changes-op-previews-design.md index 8f27b1f..b8c0628 100644 --- a/docs/plans/2026-09-06-changes-op-previews-design.md +++ b/docs/plans/2026-09-06-changes-op-previews-design.md @@ -1,10 +1,10 @@ # 变更页操作预览增强设计(2026-09-06) -> 状态:已实现(PR #499)。本文档记录五个特性的设计、关键取舍与已知限制,含 2026-09-06 规范化审查后的整改记录。特性移植自 dsh-file-trace v0.2.0/v0.2.1 会话。 +> 状态:已实现(PR #499)。本文档记录六个特性的设计、关键取舍与已知限制,含 2026-09-06 规范化审查后的整改记录。特性移植自 dsh-file-trace v0.2.0/v0.2.1 会话(PDF 渲染为作者后续追加)。 ## 背景 -变更页(Changes tab)底部预览面板此前只渲染统一 diff / 逐行读取 / 错误文本。本批扩展为:markdown 文档可切「阅读模式」、mermaid 围栏随阅读模式渲染、预览载荷做「敏感内容脱敏」、`.html` 操作可切「渲染模式」,并把 diff 引擎的语法着色表扩到此前无色/错配的一批语言。五个特性共用同一预览面板与头部 toggle 交互。 +变更页(Changes tab)底部预览面板此前只渲染统一 diff / 逐行读取 / 错误文本。本批扩展为:markdown 文档可切「阅读模式」、mermaid 围栏随阅读模式渲染、预览载荷做「敏感内容脱敏」、`.html` / `.pdf` 操作可切「渲染模式」,并把 diff 引擎的语法着色表扩到此前无色/错配的一批语言。全部特性共用同一预览面板与头部 toggle 交互。 ## 1. Markdown 阅读模式 @@ -40,6 +40,10 @@ - 实现:`HtmlRenderPreview`(`DiffPane.tsx` 导出,供沙箱 spec 钉契约)以 route-src iframe 加载 `/sidebar/html`——相对资源(`./style.css`、`img/x.png`)在路由内解析;分段读取也能渲染完整文档。 - **语义边界(刻意)**:路由服务的是**盘上已保存文件**而非操作快照——失败/未落盘的写入会渲染旧内容(README 已声明)。共享常量 `HTML_IFRAME_SANDBOX` 提到 `src/client/html-preview.ts`(编辑器与变更页共用);此面**恒定沙箱**(opaque origin + CSP 头),编辑器 tab 才持有带警告的去沙箱逃生门。 +## 6. PDF 渲染模式(作者 2026-09-06 追加) + +- 适用:`.pdf` 操作(非错误)→ 头部「渲染 / 原文」toggle,复用编辑器 `PdfView`(媒体路由字节流 + 显式类型 Blob → 浏览器原生 PDF 查看器内嵌,附下载入口)。规范化整改:扩展名正则补 `\.` 转义(原 `/.pdf$/i` 会误命中任何以 pdf 结尾的路径)、toggle 并入 `PaneToggle`。无独立单测(PdfView 行为由编辑器侧既有测试覆盖)。 + ## 规范化整改(2026-09-06 审查后) - **皮肤契约**:`.htmlFrame` 背景硬编码 `#fff` → `var(--dsw-alias-bg-base)`(对齐 `.editorHtml`);`.redactBanner` 原用的 `--dsw-alias-state-warning-primary` 在 DSW 词表中**不存在**(实际为 `state-warn-*`),var() 恒回落到硬编码 `#b8860b` → 改用真实令牌 `var(--dsw-alias-state-warn-primary)`。 diff --git a/src/client/changes/DiffPane.tsx b/src/client/changes/DiffPane.tsx index c1df107..c609433 100644 --- a/src/client/changes/DiffPane.tsx +++ b/src/client/changes/DiffPane.tsx @@ -311,7 +311,7 @@ export function DiffPane({ target, scope, height, onHeightCommit, onClose, onExp // the editor's PdfView verbatim — media-route bytes wrapped into an // explicitly-typed Blob so the browser's native PDF viewer opens (a // direct iframe src can fall back to a download). ────────────────────── - const pdfOp = target.kind === 'op' && !target.op.isError && /.pdf$/i.test(target.path) + const pdfOp = target.kind === 'op' && !target.op.isError && /\.pdf$/i.test(target.path) const [renderingPdf, setRenderingPdf] = useState(false) const pdfRenderPath = useMemo(() => { if (!pdfOp || target.kind !== 'op') return '' @@ -450,15 +450,11 @@ export function DiffPane({ target, scope, height, onHeightCommit, onClose, onExp /> )} {pdfOp && ( - + /> )}