66 lines
6.7 KiB
Markdown
66 lines
6.7 KiB
Markdown
# 对话渲染:从发布代码还原工程模块
|
||
|
||
后续已补齐 Mermaid、图片和路径点击接入,本文件记录前一批次;最新实现、证据和剩余差异见 [图表、图片与文件](对话区域-图表图片文件-2026-10-15.md)。
|
||
|
||
本轮已将 REA 取得的 WorkBuddy 渲染实现还原成独立 TypeScript/TSX 模块,并接入 YCode 实际消息界面。上一轮约 600 行的自写 token→React 渲染器已被薄适配层替换;产品现在沿用原版的主要执行顺序:
|
||
|
||
`源码预处理 → MarkdownIt token/缓存 → HTML → React 组件替换 → 已完成内容分组缓存`。
|
||
|
||
## 原版证据
|
||
|
||
原版查看仍全部通过 REA。本轮复用 runtime Evidence `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb` 的完整导出,校验选定脚本 SHA-256 后,在导出内容上进行 AST 格式化与定义分拆。没有用本地脚本直接提取 ASAR,也没有执行捕获的原版 bundle。
|
||
|
||
新增 REA 静态分析仅选择 `renderer/assets/src-DbE1_mgM.js`:父记录 `ev_98115d00e9c653dfe18ef7e3a9b3027d0566f18f8f312035872ee78f90233462`,摘要 `ev_fa709aa1ea2f2e28b9fa6b5c9d21cd49835859dfe2abbac255dfe5190e16fb66`。该文件解析成功,读取 1968427 字节、遍历 415338 个 AST 节点,无解析失败。其余 11388 个来源文件未分析,语义图受 6000 节点预算限制;不能据此宣称完成全应用依赖恢复。ASAR 的已有完整性矛盾继续保留,未作原因推断。
|
||
|
||
脚本身份:`src-DbE1_mgM.js` / SHA-256 `6c6ce63c93854783270e855572797d75e536e3b8d4548410e31fe9d147e1feb4`。
|
||
|
||
| 原版定义或包含区间(UTF-16、右端不含) | 工程落点 |
|
||
| --- | --- |
|
||
| CJK `[624883,626500)` | `workbuddy/markdown/cjk.ts` |
|
||
| metadata、raw HTML、linkify 的 Gf/ep 初始化器及 `[648032,649516)` | `code-fence.ts`、`html-fallback.ts`、`linkify.ts` |
|
||
| `initMarkdownIt` `[656816,659240)` 及 math/Prism 包含初始化器 `[652022,659243)` | `parser.ts`、`languages.ts`、`math.ts` |
|
||
| provider `[718666,718860)` | `context.tsx` |
|
||
| CodeLikeBox 包含初始化器 `[718885,719202)`;Copy `[719311,720135)`;CodeBlock `[720136,721212)` | `components/CodeBlock.tsx` |
|
||
| MathInline `[731414,731499)`;MathBlock `[731500,731728)` | `ReactMarkdown.tsx` |
|
||
| OpacityText `[798343,798513)` | `ReactMarkdown.tsx` |
|
||
| finished emphasis/XML helpers `[806993,809247)`;主 renderer 包含初始化器 `[818611,827154)` | `source-projection.ts`、`ReactMarkdown.tsx` |
|
||
| boundary/cache 包含区间 `[812685,816842)`;grouping `[818332,818478)` | `incremental.ts` |
|
||
|
||
工程目录为 `src/renderer/src/workbuddy/`。模块接口、适配边界见其中 README;具体 assignment 的原始范围保存在 `.tmp/rea-chat-recovered/manifest.json`。该派生材料包含 309 个顶层声明片段和 90 个实际赋值定义,仅用作阅读依据,不进入产品构建。
|
||
|
||
REA 的自动 Wakaru 恢复工具要求 Linux x64,当前工作区是 Windows。本轮使用已由 REA 获取的代码,通过 AST 分拆和人工类型化完成工程还原,没有为此安装或切换宿主环境。
|
||
|
||
## 相比上一轮补齐或纠正
|
||
|
||
- CJK:原版扫描算法与当前 `markdown-it-cjk-friendly@3.0.0` 不同,已恢复原版算法并移除该插件依赖。
|
||
- 标题:恢复只处理等号 Setext 标题的特殊 `lheading` 规则。
|
||
- 流式提示:按原版先切最后 6 个 UTF-16 单元,再按字符生成 token;寻找最后一个符合条件的文字子 token,遇到末尾 fence 停止。OpacityText 使用 `0.1 × level` 固定透明度,移除上一轮推测的定时动画。
|
||
- 内容处理:恢复模型协议 XML 清理、LaTeX `\[...\]` / `\(...\)` 转换、引号强调修正、完成后的 escaped/residual emphasis 修复。
|
||
- 解析与缓存:恢复安全前缀边界、引用定义和数学块的禁用条件、map/id 重排、前缀 loadingDot 撤销及顶层分组缓存。
|
||
- 代码:恢复原版 wrapper/header/content/pre 层级。复制接收原始代码,显示接收渲染后的 children,两者独立;语言 class 保留解析器实际输出。文件点击必须有 handler。
|
||
- Prism:恢复 24 个懒加载入口、别名、依赖顺序与加载完成通知,包含 C++、PHP、TSX、Scala 等;加载完成后重渲染高亮。
|
||
- 数学:原版 KaTeX 模块显示版本 0.16.47,已锁定该版本;补齐行内、块级、集合宏及 latex fence。文档型或无效 LaTeX 回退代码块。
|
||
- 表格:使用原版 token 的 `data-content`,在末尾表格仍生成时禁用引用,完成后启用;保留 LF 和无终止换行规则。
|
||
|
||
## 验证
|
||
|
||
| 验证 | 结果与范围 |
|
||
| --- | --- |
|
||
| `npm run build` | 类型检查、实际渲染产物及懒加载 chunk 构建通过 |
|
||
| `npm run test:recovered` | 5 个套件通过:还原 parser、21 项源投影、代码组件契约、流式缓存、数学/回退/状态规则 |
|
||
| 流式缓存验证 | 9 种输入的 402 个逐字前缀;268 次缓存复用,与完整重解析的 HTML 和行号 map 一致,缓存前缀未被污染 |
|
||
| `npm run test:markdown` | 30 项集成渲染检查通过;按源码修正 UTF-16、class、语言输出和静态 span 的预期 |
|
||
| `npm run test:chat` | 消息顺序、发送状态、23 项工具适配检查通过,确认渲染器替换没有破坏共享契约 |
|
||
| YCode 浏览器离线样本 | 3 处公式、1 个公式块、22 个代码高亮 token、文件 L12-L15、复制成功反馈、表格源码进入草稿并聚焦;模型协议 payload 不可见 |
|
||
| 1334×901、960×640 视口 | 无页面横向溢出;小视口代码框宽 592px;未使用原版截图作对照 |
|
||
|
||
UI 样本位于 `scripts/fixtures/source-recovery.mjs`。截图 `.tmp/chat-source-recovery-2026-10-15.png` 为实际构建产物的离线样本。测试假桥不写入用户会话、不请求模型,也不改变系统剪贴板。浏览器测试还发现并修复了测试服务器使用字符串替换注入 fixture 时,将 `$$` 意外缩为 `$` 的问题;已改用 replacement callback,生产渲染器不涉及该注入路径。
|
||
|
||
## 尚未还原与未验证
|
||
|
||
工程还原已覆盖上述执行链和模块,尚未证明原作者的完整工程结构、全部依赖版本和全部渲染状态都已恢复。Mermaid 仍使用代码回退;敏感投影、图片桥接/预览、文件宿主操作、宽度感知、全部 tooltip/icon/theme CSS 等仍需继续逐项还原。
|
||
|
||
原版像素采集仍受 REA `target_not_allowed` 限制;组件 class 和层级有源码依据,当前样式中的 token、边框与几何还不能宣称像素 1:1。OMP 的真实 ready/重启上下文验证仍是上一轮记录的未通过项,本轮没有改变这一结论。
|
||
|
||
没有重启当前 WorkBuddy 或 YCode 原生窗口。`out/` 已更新;本轮浏览器验证使用独立临时服务器,生产数据未改变。
|