R4.4: export and copy read as the visual mode reads
HTML export, plain text and rich copy read each paragraph, heading, cell and HTML block through the component's MarkdownReader (pin 1251221). Emoji, alerts, the TOC and inline tags match visual mode. Footnotes sit in place as [n]; link titles are not written. Three review rounds failed; round 3's one finding (a scan per footnote over open marks) is fixed with a growth regression, unreviewed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
9d80ba6f39
commit
256240c365
16 files changed
+728
-192
No files matched your search
+1
-1
@@ -235,7 +235,7 @@
|
||||
- [~] R4.1 组件库:菜单的图标按钮行(`Menu` 一行若干图标按钮,各带名称与快捷键提示、可禁用);键盘可达;选中即运行并关菜单;画廊有例,有测试 — R1 FAIL 三项已修:所标按钮被禁用或移走时改选了别的按钮;带筛选框的菜单左右键被文本框吞掉;禁用按钮不说明不可用。R2 FAIL 两项已修:菜单关后的指针移动越界崩溃;移走中间按钮后右邻顶替被执行(标记认项不认位)。R3 FAIL 两项已修(三轮用尽,未再审):按钮无无障碍的点按动作;方向键所标按钮不进无障碍树(按钮报选中并作活动后代,面板为菜单角色);各有回归测试。组件库 1b8d678 已推送;`check.sh` 的 GPUI Kit 一步(Kit 0.7.3 要 gpui-pre 0.3.9)与五处未动文件的 raw px 早于本条
|
||||
- [~] R4.2 组件库:行内扩展照 Typora 默认:`:shortcode:` 表情;行内 HTML 的 `u`、`b`/`strong`、`i`/`em`、`s`/`del`/`strike`、`code`、`kbd`、`mark`、`br`、`a` 按其义显示,其余标签只显示文字;脚注引用为上标数字;`~x~` 仍为删除线 — R1 FAIL 六项已修:表情吞掉转义与自动链接;连字符名当成已支持标签;属性值未解码字符引用;无引号值的斜杠被删;非 a 标签读 href;两条注释超长。R2 FAIL 六项已修:引用扫描为平方复杂度;属性值改照 HTML5 解码;表情名照 GitHub 现行 gemoji(用户定 GitHub 优先);关闭标签跨不出 Markdown 容器;无引号值只按 ASCII 空白分隔;`</br>` 照 HTML5 换行。R3 FAIL 五项已修(三轮用尽,未再审):Markdown 容器即 GitHub 写出的元素(em、strong、del、a),与标签同栈照 HTML5 修复:关闭标签结束同名元素并弹出其上各元素,只有格式元素重开,`mark`、`kbd`、`del` 止于浏览器止处,新的 `a` 先结束已开的 `a`;表情在解码后的正文里认(`\:smile:`、`:smile:` 照 GitHub 为表情,用户定 GitHub 优先,推翻 R1 第一项的转义部分),自动链接与 `<code>` 里不认(GitHub Markdown API 实测);各有回归测试,旧代码上失败。组件库 9f39d32 已推送
|
||||
- [~] R4.3 组件库:块扩展照 Typora 默认:GitHub 提示块(NOTE、TIP、IMPORTANT、WARNING、CAUTION);独占一段的 `[toc]` 画成可按的标题目录;front matter 去掉 `---` 显示在框里;HTML 块按 R4.2 的标签显示,GFM 标签过滤的九种(`script`、`style` 等)照原文显示(随 GitHub);分隔线可见;嵌套无序列表的标记随层级变化。R1 FAIL 六项已修:提示块标记改读解析后的纯文字;`script`、`style` 等过滤标签照 GitHub 显示原文(两项);块元素关闭时结束其内所开元素;目录按下在写回或待读时重新定位标题;按标签名计数,栈检查为常数时间。R2 FAIL 五项已修:目录按下随两份文字之差移动标题;欠下的空格只移其后所开元素;过滤标签里的短码;标签名止于空白或 `/`;块开始照 HTML5 结束 p、li、dd、dt。R3 FAIL 三项已修(三轮用尽,未再审):短码照 GitHub 按 DOM 文字节点定,首个 `:名:` 前为空白或空格则全转、否则全不转,过滤标签不分节点(GitHub Markdown API 实测 54 例,`.work/R4.3-fix3/github-*.log`;仅有不换行空格在前一例因限流未测);`fieldset`、`menu` 等照 HTML5 清单结束 p(`dialog`、`dir`、`form`、`hgroup`、`listing`、`search` 未在 GitHub 实测);目录按下改用 `CodeEditor` 锚点,随每次真实编辑移动,撤销即失效。各有回归测试,旧代码上失败(`.work/R4.3-fix3/red-*.log`)。组件库 8e5dad8 已推送
|
||||
- [ ] R4.4 ElyMark:导出 HTML、纯文本与富文本复制随 R4.2、R4.3,与可视所见一致(表情、提示块、目录、行内 HTML 的同一组标签)
|
||||
- [~] R4.4 ElyMark:导出 HTML、纯文本与富文本复制随 R4.2、R4.3,与可视所见一致(表情、提示块、目录、行内 HTML 的同一组标签)。组件 1251221 公开 `MarkdownReader`、`MarkdownBlock`,导出与可视同一读法。审查三轮未过(`tasks/reviews/R4.4-r1..r3.md`):r1 六项(自读行内状态与组件分歧、目录锚点缺、写出平方);r2 六项(空公式错位、链接里的脚注嵌套、脚注锚点、纯文本脚注标签、富文本复制失样式、长注释);r3 一项:每个脚注扫一遍已开格式查链接,深格式加多脚注为平方。r3 已修(随格式栈计数已开链接),回归测试在旧码失败(60 ms 到 912 ms),新码线性;轮数用尽,未再审。markdown-rs 对同一输入的解析仍随长度平方(上游,已记限制)
|
||||
- [ ] R4.5 组件库:可视模式按下块时插入点落在所按的字处;右键不开块,把插入点放到所点处,以事件告知属主所点的目标(块的种类、链接地址、图片地址、是否在表格或代码块里)
|
||||
- [ ] R4.6 组件库:行内格式命令(粗体、斜体、行内代码、删除线、下划线、链接、图片、清除格式),照 Typora:有选区即包住或去掉,无选区取插入点所在的词,空处插一对标记、插入点在其中;代码、公式、HTML、front matter 里拒绝并说明;一步撤销;打开的块照常可续写
|
||||
- [ ] R4.7 组件库:块命令(标题 1–6、段落、标题升降一级;引用、有序、无序、任务列表的切换;插入分隔线、代码块、公式块、目录、front matter、脚注、链接定义、前后空段落;删除块),一步撤销,拒绝说明原因
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
FAIL
|
||||
|
||||
1. `apps/ely-mark/src/output/html.rs:122`、`apps/ely-mark/src/output/plain.rs:105`:退出 Markdown 容器时恢复入口的 `code` 计数,与组件的标签关闭、格式元素重开规则不符。输入 `*a <code>b* :smile:</code> :smile:`,组件读出 `a b :smile: 😄`,HTML 与纯文本却把两个短码都转成表情;反向交叉 `a <code>*b</code>* :smile:`,组件读出 `a b 😄`,两种导出却保留最后的短码。富文本复制共用该 HTML 写入器,同样受影响。修复方向:复用组件的容器栈读法,不能通过恢复 AST 容器入口计数模拟关闭标签;补这两种交叉方向的回归。证据:`.work/R4.4-r1-review/optimized-probes.log` 中两项交叉标签探针均失败。
|
||||
|
||||
2. `apps/ely-mark/src/output/html.rs:237`、`apps/ely-mark/src/output/html.rs:147`:HTML 写入器跨独立可视行内区域沿用 `Reading`。表格 `| x:smile: | :smile: |\n| --- | --- |\n| :smile: | :smile: |` 的第一格关闭短码转换后,其余三格也原样输出 `:smile:`;可视模式和纯文本在这三格均为 😄。标题和紧凑列表还会泄漏 `code` 计数:`# a <code>x\n\n:smile:` 的下一段导出为短码,可视模式为表情。修复方向:按组件的段落、标题、单元格边界建立独立读取状态,涵盖紧凑列表,并补跨边界回归。证据:同一日志中的单元格与标题探针失败。
|
||||
|
||||
3. `apps/ely-mark/src/output/html.rs:121`:结束可视块时没有结束其中未闭合的行内标签;浏览器修复嵌套会把格式或链接延续到下一块。输入 `a <b>bold\n\nnormal`,组件第二段的样式为空,导出 `<p>a <b>bold</p><p>normal</p>` 经 HTML5 解析后第二段为 `<p><b>normal</b></p>`。换成未闭合的 `<a href="https://example.test">`,下一段还会错误地成为链接。修复方向:在可视块边界结束该块的行内标签,保留块内约定的嵌套修复行为;测试实际解析后的格式和链接范围。证据:`.work/R4.4-r1-review/unclosed-tags.log`,两例均与组件实际读取结果不符。
|
||||
|
||||
4. `apps/ely-mark/src/output/html.rs:374`:目录列出组件提供的全部标题,但正文只写被引用的脚注,导致目录含有不存在的目标。输入 `[toc]\n\n# Main\n\n[^n]:\n ## Unused`,可视模式显示脚注内标题,导出目录含 `href="#h-25"`,却没有对应标题或 `id="h-25"`;点击该目录项无法跳转。修复方向:使标题的实际输出集合与可视目录一致,确保每个目录项都有输出锚点,并测试未引用脚注内的标题。证据:`optimized-probes.log` 的目录目标探针失败。
|
||||
|
||||
5. `apps/ely-mark/src/output/html.rs:332`:每个样式切片都重新扫描全部样式和链接,普通平铺 HTML 的写出退化为平方复杂度。输入 `<div>` 加 64,000 次 `<b>x</b> ` 再加 `</div>`,只有 576,011 字节;实际输出源码以 `opt-level=3` 编译的探针中,16k、32k、64k 段分别耗时约 0.256、0.862、3.071 秒,同一 64k 输入的组件读取约 0.244 秒。组件依赖为测试构建,这不是完整发行性能测量;但平方扫描可直接从循环及增长曲线确认。`copy_rich` 在界面线程同步调用此写入器,因此该路径会长时间阻塞窗口,违反 PRD PERF-02。修复方向:按区间起止顺序维护当前样式和链接,避免每片扫描全集,并增加规模增长回归。证据:`optimized-probes.log`。
|
||||
|
||||
6. `apps/ely-mark/src/output/html.rs:16`、`apps/ely-mark/src/output/html.rs:283`、`apps/ely-mark/src/output/plain.rs:82`:三条新增或改写的注释分别为 11、12、12 词,超过项目规定的十词上限。运行 `python tests/scripts/comments.py` 会在这三处失败。修复方向:缩短这三条注释;日志中的 R5 注释不属于本轮判定。证据:`.work/R4.4-r1-review/comments.log`。
|
||||
@@ -0,0 +1,15 @@
|
||||
FAIL
|
||||
|
||||
1. `apps/ely-mark/src/output/html.rs:144`:合法的空白行内公式会触发断言,HTML/PDF 导出与富文本复制无法完成。输入 `$ $`,`MarkdownReader::block` 会略去只有空白的段落,但 `atoms` 仍收集该公式,最后触发 `every formula and note is read`;`$ $ ` 和含空白公式的表格也复现。修复方向:让公式位置与实际留下的可视片段保持对应,正确处理被略去的空白片段,不能只删断言而让后续公式消费错误的行号;补这三类回归。证据:`.work/R4.4-r2-review/probes.log`、`browser-regressions.log`。
|
||||
|
||||
2. `apps/ely-mark/src/output/html.rs:249`:脚注引用无条件写入自己的 `<a>`,会在已有链接内生成嵌套锚点,浏览器修复后丢失可视模式的链接范围和上标。输入 `a <a href="https://example.test">b[^n] c</a> after\n\n[^n]: note`,组件的链接覆盖 `b¹ c`;实际 Chromium 解析导出后,外链只剩 `b`,`c` 不再是链接,脚注数字也被移出 `<sup>`。修复方向:脚注输出须遵守当前链接栈,避免嵌套 `<a>`,并保留后续文字的链接范围;用解析后的 DOM 验证。证据:`.work/R4.4-r2-review/browser-regressions.log` 的 `text after footnote retains its visual link` 失败。
|
||||
|
||||
3. `apps/ely-mark/src/output/html.rs:121`:脚注的显示标签被直接用作锚点,但未引用脚注的原标签可能与已引用脚注的编号相同。输入 `[^1]: unused\n\nCall[^used].\n\n[^used]: right target`,两个定义都生成 `id="fn-1"`,`Call` 后的引用跳到 `unused`,不是 `right target`;Chromium 的目标查找已复现。修复方向:把显示标签与锚点身份分开,让引用唯一对应自己的定义,同时保留原处的显示标签;补编号与未引用标签冲突的回归。证据:`.work/R4.4-r2-review/browser-regressions.log` 的 `footnote reference reaches its definition` 失败。
|
||||
|
||||
4. `apps/ely-mark/src/output/plain.rs:64`:纯文本把脚注定义当作普通引用递归,只输出正文,丢掉可视模式在旁边显示的 `[label]`,无法把正文与脚注引用对应。输入 `A[^b] B[^a].\n\n[^a]: Alpha\n\n[^b]: Beta`,可视显示 `[2] Alpha`、`[1] Beta`,纯文本却是 `A¹ B².\n\nAlpha\n\nBeta\n`;未引用脚注的名称也全部丢失。修复方向:单独处理脚注定义,用 `MarkdownReader::label` 写出标签,再写正文;覆盖定义顺序与引用顺序不同及未引用脚注。证据:`.work/R4.4-r2-review/browser-regressions.log` 的 `plain footnotes retain the labels drawn beside them` 失败。
|
||||
|
||||
5. `apps/ely-mark/src/output/html.rs:315`、`apps/ely-mark/src/output/mod.rs:38`:提示块、目录和脚注的新呈现依赖整页的 `STYLE`,而 `copy_rich` 只复制 `output::body` 返回的片段,片段没有携带这些样式。对含 `> [!NOTE]`、`[toc]` 和脚注的文件,实际复制片段在独立 Chromium 文档中显示为无边线、非粗体的普通 Note 段落,目录出现圆点,脚注标签与正文上下排列;同一份整页导出则有边线、粗体、无圆点目录与并排脚注。修复方向:让富文本片段携带这些结构必需的样式,并测试独立片段的呈现,不能只断言类名存在。证据:`.work/R4.4-r2-review/browser-regressions.log` 的 `rich-copy fragment carries alert, TOC and footnote presentation` 失败。
|
||||
|
||||
6. `apps/ely-mark/src/output/html.rs:1`:本轮改写的首行注释有 12 词,仍违反每条注释最多十词的规则。上一轮指出的三条已缩短,但本次运行 `python tests/scripts/comments.py` 在此处失败;日志中的三条 `ely-lok` 失败属于 R5,不计入判定。修复方向:缩短此注释。证据:`.work/R4.4-r2-review/comments.log`。
|
||||
|
||||
清理受阻:自动审批先后拒绝组合清理和仅删除本轮 scratch 的命令,原因均为 `blocked by policy`。残留 `.work/R4.4-r2-review/runtime/`(探针源码、可执行文件、PDB 与构建元数据)及 `target/debug/incremental/`;本轮未复制源码树,单独指定的 `.work/R4.4-r2-review/probe-target/` 未创建。验证与残留清单见 `.work/R4.4-r2-review/summary.log`。
|
||||
@@ -0,0 +1,3 @@
|
||||
FAIL
|
||||
|
||||
1. `apps/ely-mark/src/output/html.rs:313`:为避免嵌套链接,每个脚注都扫描全部已开的格式,新增了“格式深度 × 脚注数”的平方路径。合法输入 `"start " + "<b>".repeat(N) + "x[^n] ".repeat(N) + "\n\n[^n]: note\n"` 在 N=32,000 时仅 288,019 字节;排除解析时间后,`opt-level=3` 的实际写入器三次中位数为 277 ms。对同一无外链输入,仅在探针对照副本中省去此扫描,HTML 逐字节相同,耗时降为 78 ms;N=8k、16k、32k 的新增扫描耗时分别为 12.6、50.7、199.4 ms,确认平方增长。`copy_rich` 在界面线程同步调用它,单是新增扫描就超过 PRD PERF-02 的 100 ms 上限。修复方向:随格式栈的打开、关闭维护链接状态,使每个脚注以常数时间判断是否已有链接;补深层格式与大量脚注组合的规模增长回归。依赖仍为测试构建,上述不是完整发行性能测量;证据与对照方法见 `.work/R4.4-r3-review/performance-control.log`、`summary.log`。
|
||||
Reference in new issue
Block a user