import { readFileSync, writeFileSync } from 'node:fs'; function patch(file, pairs) { let t = readFileSync('parts-r/' + file, 'utf8'); for (const [a, b] of pairs) { if (!t.includes(a)) { console.log('MISS ' + file + ' :: ' + a.slice(0, 60)); continue; } t = t.split(a).join(b); } writeFileSync('parts-r/' + file, t, 'utf8'); console.log('patched ' + file); } patch('06-tokens.md', [ ['| 固定包围盒 | 不适用(classisland fixed 行宽按内容 + 窗口按行宽自适应;仍需包围盒) |', '| 固定包围盒(fixed) | `宽 = min(工作区宽, 960)`、`高 = 40 + 2×pad`(pad 默认 20,覆盖阴影);行内容在窗口内按停靠对齐并在超出时截断/省略;消息到达不改变窗口尺寸 |'], ]); patch('07-island-components.md', [ ['| 窗口几何 | 宽按内容、高恒 40+2×pad |', '| 窗口几何 | 宽 = min(工作区宽, 960),高恒 40+2×pad(pad 默认 20) |'], ]); patch('10-animations.md', [ ['| t=0 | 主进程把消息压入队列并把 `mode` 切为 `expanded`;窗口在「不可见时」先扩到气泡所需包围盒 |', '| t=0 | 主进程把消息压入队列并把 `mode` 切为 `expanded`;窗口使用预设包围盒(宽 = min(工作区宽,960)、高 = 40+2×pad),**不因气泡扩窗** |'], ]); patch('04-file-plan.md', [ ['- **风险**:行内气泡会改变行宽测量;必须由 `geometry.ts` 统一计算"内容自然宽/截断/换行",并让主进程窗口包围盒同步(见 05 的 metrics);「还有 N 条」跳转必须带未读上下文,不得丢失已读回执。', '- **风险**:行内气泡只改变行内内容测量与截断(正文最多 2 行、超出省略),**不改变窗口包围盒**(fixed 窗口尺寸固定为 min(工作区宽,960) × (40+2×pad));「还有 N 条」跳转必须带未读上下文,不得丢失已读回执。'], ]); patch('12-acceptance.md', [ ['**fixed(classisland 风格)**', '**fixed(classisland 风格)**\n- [ ] fixed 窗口包围盒固定:宽 = min(工作区宽, 960)、高 = 40 + 2×pad(pad 默认 20);消息到达/展开/多条列表均不改变窗口尺寸。'], ]);