R4.2: where Typora and GitHub read a file apart, ElyMark follows GitHub (user, 2026-10-13)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
ZacharyZhang-NYandClaude Opus 5.5 committed 2026-10-13 22:06:00 -04:00
1 parent 962f274cc6
commit c4cb075ce3
4 files changed
+32 -2

No files matched your search

+1 -1
View File
@@ -487,7 +487,7 @@ Git 托管、PR 审核平台、Issue 系统、CI 平台和远程开发环境不
| MARK-01 | 本地文件 | 新建、打开、保存、重命名和另存;支持直接打开文件或文件夹 |
| MARK-02 | 编辑模式 | 可视化、源码和只读预览可切换;切换本身不修改文件内容 |
| MARK-03 | Markdown | 支持 CommonMark 与 GFM 常用语法:标题、列表、任务、引用、链接、图片、表格和代码块 |
| MARK-04 | 扩展语法 | 支持脚注、数学公式、Mermaid 与 YAML front matter;照 Typora 默认显示 `:表情:`、行内与块级 HTML 的常用标签、GitHub 提示块与 `[toc]` 目录;`==`、`^`、单个 `~` 照 GFM,不作高亮、上下标;资源随包提供 |
| MARK-04 | 扩展语法 | 支持脚注、数学公式、Mermaid 与 YAML front matter;照 Typora 默认显示 `:表情:`、行内与块级 HTML 的常用标签、GitHub 提示块与 `[toc]` 目录;`==`、`^`、单个 `~` 照 GFM,不作高亮、上下标;Typora 与 GitHub 读法不同处随 GitHub(表情名、标签与强调交叉);资源随包提供 |
| MARK-05 | 导航 | 提供文件树、文档大纲、多标签、最近文件和按标题跳转 |
| MARK-06 | 编辑工具 | 支持查找替换、源码正则搜索、缩进、列表续写、表格行列操作和代码高亮 |
| MARK-07 | 附件 | 支持拖放和粘贴图片,默认复制到文档旁的资源目录并写入相对路径 |
+1 -1
View File
@@ -286,4 +286,4 @@ cargo run -p ely-doc 启动一个应用(ElyDoc 先 cargo build -p ely
- 2026-10-11(用户定:ElyMark 不用 CEF,不用 Electron):ElyMark 改为原生。界面用组件库的 Markdown 组件(`documents::MarkdownEditor` 一族,缺的在组件库补并推到 Gitea),解析用 markdown-rs(`markdown` 1.0.0),公式用 RaTeX,Mermaid 用 mermaid-rs-renderer,PDF 用 MuPDF Story;CEF 随之删去,ElyMail 的正文也不用 CEF 与 Electron。进度在 `tasks/TASKS.md` 的 C14。组件库 fcad0ff 与 508cc55:`MarkdownRenderer`、`MarkdownEditor`、Markdown 着色、块范围与链接查找改读 markdown-rs 的语法树(GitHub 风格加公式),引用式链接与图片按定义解析,图片把所在段落分开,单行 `$$…$$` 为块公式,软换行(LF、CRLF、CR)读作空格,嵌套在引用与列表里的定义同样解析,强调与链接里的图片仍是图片(链接里的图片可按);`BlockEditor` 的导入导出不属 ElyMark,仍用 pulldown-cmark。markdown-rs 读嵌套图片时只留外层的说明。组件库 d5ecc5a:块公式经 `typography::Latex` 由 RaTeX 排出(字形为轮廓,按窗口缩放画),```` ```mermaid ```` 块经 `documents::Diagram` 由 mermaid-rs-renderer 画出(Mermaid 自己的深浅主题,底色与字色取 Ely 色板),都作为 gpui 资源在后台排版,RaTeX 或 Mermaid 对已解析的输入 panic 时显示为错误;`MarkdownRenderer::base` 给出文档所在文件夹,相对与 file 地址的图片从中读取并按自身大小、不超过栏宽显示,`data:` 地址解码,网络图片不载入(写明)。组件库 ab9a14c:每个公式、图与图片元素经 `primitives::held` 持有其资源,按资源计数持有者(8b9820b;画出的图存在共享的记录里,9036c92 起由最后离开的持有者释放,哪怕它自己还没收到图),最后一个持有者换了内容或离开窗口才从 gpui 资源缓存移除、在本帧之后从图集释放,共用同一内容的元素(含 gpui 缓存的视图)不受影响;公式按字形实际范围取画框,字形不被裁;公式失败显示原因、RaTeX 给的位置与原文,日志不含公式;`file:` 地址去掉查询与片段,`localhost` 为本机,Windows 上别的主机为共享路径,他处拒绝;Mermaid 的节点与饼图文字取 Ely 的前景色。组件库 2b6f551:`documents::MarkdownDocument` 是文件级的 Markdown 文档:全文与撤销在一个 `CodeEditor` 里(`CodeEditor::highlighter` 以 `markdown_highlights` 着色,无行号);可视以 gpui `list` 逐块画出文件的顶层块(链接定义、HTML、front matter 照原文显示,每个字节都在块里或块间),按下的块开成源码(`TextInput`),其键入即刻算作文档的文字,写回为一步撤销,上下键越过块边进入相邻块,Esc 写回;Cmd(他处 Ctrl)按下交给链接;预览只读;源码为编辑器本身;128 KiB 以内当场解析,更长的在后台解析,解析中按下块不打开(日志);新解析保留两端相同的块,滚动不跳。`CodeEditor` 的撤销历史最多留 64 MiB 文字,超出先丢最旧的步;`CodeEditor::reset` 换文字且撤销重新开始;`MarkdownMode` 加 `Preview`。组件库 fc181b4:一个插入点通用于各模式(编辑器的选区,写回的块移动它);`set_caret` 与 `set_top_line` 分别设插入点与视图,换模式保持顶行;按下的块在前一块写回后仍是所按的块(按偏移换算,结构变了即不开并记日志);块是 Tab 停靠点,Enter 或空格打开;预览不收按下、撤销与重做;撤销与重做每次记录、输入法组字、撤销、重做后都限在 64 MiB 内(先丢最旧的撤销,再丢最远的重做)。组件库 433c38f:只有对当下文字的解析才能打开块(解析的文字与编辑器相同),否则拒绝;要求的顶行在其文字解析后才落定:先到所在块,下一帧按块高的比例到块内位置,再有新的要求即接着放下一个;源码与列表之间切换保持顶行,可视与预览共用一个列表,切换不动滚动。组件库 abac8b4:顶行的要求带编号,迟到的帧回调只完成自己的那个;文字一换即按新文字重新放,放时按当下文字的行数夹住;`reveal` 是同样的要求(插入点设在该行,该行放到顶上),新文字解析后才落定。组件库 f59c9f7:文字超过读取上限(2 MiB)即丢掉旧的读取,大纲与块为空。ElyMark(C14.4):视图即一个 `MarkdownDocument`,文本即文件原文(BOM 与 CRLF 照 `text.rs` 存回),新建、打开、保存、另存、重命名经外壳照旧;视图在建成后的下一轮更新向外壳报一次载入(文档在 `new` 里当场解析,外壳此时还未订阅);文字超过 2 MiB 即只用源码并转去源码(随当前文字,不只看打开时);网页实现的查找替换、表格、附件、书写视图的应用、导出与打印Line truncated
- 2026-10-12(用户报:Windows 上 ElyMark 的最近列表显示 `\\?\C:\…`):凡取真实路径一律 `dunce::canonicalize`(ely-files 的会话登记、ely-lok 的内核目录与配置目录、ElyMark 的文件夹、最近列表、会话与标签比对;ElyTree 原已如此):Windows 上能写成普通路径即普通路径,他处同 `std::fs::canonicalize`。只供读写的路径照旧保留 `\\?\`(`ely_files::save` 的落盘与同文件判定:在 250 字的文件夹里,普通写法的暂存文件名越过 260 而写不进),保存后交给会话与 `Saved` 的路径以 `dunce::simplified` 整体判定后为普通写法;ely-office 另存的目标先以完整路径求出,再以 `dunce::simplified` 整体判定能否写成普通路径(先简化文件夹再接文件名时,结尾带空格的名字会被 Windows 削成另一个已打开的文件)。`ely_files::recent` 读入时以 `dunce::simplified` 去掉旧版写下的 `\\?\` 并去重,下次写入即为普通路径。
- 2026-10-12(用户报:ElyTable 的网格上一直是文字指针):`LokView` 原把指针写死为文字指针。现不按键的鼠标移动也交内核(悬停,不算编辑、不加修订),内核以 `LOK_CALLBACK_MOUSE_POINTER` 回报 CSS 指针名(`vcl` 的 `gaLOKPointerMap`),随事件批次到视图,换成 gpui 的指针:单元格上为箭头,编辑单元格或文字时为文字指针,链接为手;未知的名字记警告并用箭头。
- 2026-10-13(用户定):ElyMark 以 Typora 1.14.10 为对照(R4;安装包与解包放在 `TyporaRef`,不入库):可视模式仍是按下的块以原文编辑;语法照 Typora 默认(`:表情:`、行内与块级 HTML 的常用标签、GitHub 提示块、`[toc]`、front matter 框;`==`、`^`、单个 `~` 照 GFM);快捷键照 Typora(Ctrl+1–6 标题、Ctrl+0 段落、Ctrl+/ 源码、Ctrl+Shift+=/-/0 字号、F8 专注、F9 打字机);右键菜单照 Typora 的布局,剪贴板与格式为图标行(组件库 `Menu` 新增)。审查改用 gpt-6-astra,effort max,fast。
- 2026-10-13(用户定):ElyMark 以 Typora 1.14.10 为对照(R4;安装包与解包放在 `TyporaRef`,不入库):可视模式仍是按下的块以原文编辑;语法照 Typora 默认(`:表情:`、行内与块级 HTML 的常用标签、GitHub 提示块、`[toc]`、front matter 框;`==`、`^`、单个 `~` 照 GFM);快捷键照 Typora(Ctrl+1–6 标题、Ctrl+0 段落、Ctrl+/ 源码、Ctrl+Shift+=/-/0 字号、F8 专注、F9 打字机);右键菜单照 Typora 的布局,剪贴板与格式为图标行(组件库 `Menu` 新增)。Typora 与 GitHub 读同一份文件不同时随 GitHub(GFM,§14.3):表情名取 GitHub 现行的 gemoji(`emojis` 库,`:cricket:` 为蟋蟀),HTML 标签与强调交叉时照浏览器修复 CommonMark 输出,`</br>` 照 HTML5 也是换行;Typora 只决定哪些扩展显示。审查改用 gpt-6-astra,effort max,fast。
+15
View File
@@ -0,0 +1,15 @@
FAIL
1. [P2] `../Ely-GPUI-Components/src/documents/tree/mod.rs:308` — 对 markdown-rs 已解码的所有 Text 再替换表情,丢失转义及自动链接语义。实测 `Show \:smile: literally.` 和 `Show &#58;smile: literally.` 均显示为 `Show 😄 literally.`;`<https://example.test/:smile:>` 的地址文字也被替换成表情。Typora 的转义、实体和自动链接各自成词元,不再参与短码转换。应按原始源码及语法上下文识别短码,保留这些字面文本,并补回归测试。三个失败断言见 `.work/R4.2-r1/probes.log`。
2. [P2] `../Ely-GPUI-Components/src/documents/tree/html.rs:42` — 标签名在连字符处截断,把未知标签当成已支持标签。实测 `a <u-box>word</u-box> tail` 给 `word` 加下划线;`a <br-box>inside</br-box> end` 变成两次换行,违反 R4.2「其余标签只显示文字」。Typora 的标签名规则包含连字符。应读取完整标签名后精确匹配,并覆盖这些未知标签。
3. [P2] `../Ely-GPUI-Components/src/documents/tree/html.rs:82` — HTML 属性值未解码字符引用,链接点击会收到错误地址。实测 `<a href="https://example.test/search?q=one&amp;page=2">results</a>` 保存的链接仍含 `&amp;`,第二个查询参数因此成为 `amp;page`。应按 HTML 属性语义解码命名及数字字符引用,再交给链接处理器;补充目标地址的断言。
4. [P2] `../Ely-GPUI-Components/src/documents/tree/html.rs:50` — 对整个属性串执行 `trim_end_matches('/')` 会删除未加引号属性值里的有效斜杠。实测 `See <a href=/path/>results</a>.` 的目标从 `/path/` 变成 `/path`;Typora 的规则将该斜杠保留在属性值中。应在解析属性时区分标签结束符与属性内容,保留完整 href,并补此用例。
5. [P2] `../Ely-GPUI-Components/src/documents/tree/mod.rs:134` — 所有支持的标签都读取 `href`,随后 `close` 将它加入可点击链接。实测 `See <b href="https://example.test/">bold</b>.` 的 `bold` 除加粗外还会打开网址,但 `b` 的该属性没有链接语义。应仅为 `a` 标签记录链接地址,其他格式标签不得产生链接;补充非锚点标签带 href 的测试。
6. [P3] `../Ely-GPUI-Components/src/documents/tree/html.rs:34`、`../Ely-GPUI-Components/src/documents/tree/mod.rs:75` — 两条新增注释分别为 11 个英文单词,超过本轮明确要求的十词上限。按空白分词即可复现,记录见 `.work/R4.2-r1/comments.log`。应各压缩至十词以内。
清理例外:自动审批审查拒绝 PowerShell 删除临时副本、归档和临时文件,仅返回 `blocked by policy`。已用 `cargo clean` 删除两个独立构建目录;仍留有项目内 `.work/R4.2-r1/source/`、`.work/R4.2-r1/parser/`、`.work/R4.2-r1/tmp/`、`.work/R4.2-r1/source.tar`。完整库测试 1874 项通过,原生及 WebAssembly Clippy、格式检查通过;构建、探针及核验日志在 `.work/R4.2-r1/`。
+15
View File
@@ -0,0 +1,15 @@
FAIL
1. [P2] `../Ely-GPUI-Components/src/documents/tree/html.rs:119` — 字符引用扫描反复搜索整个剩余字符串,使新增短码处理退化为平方复杂度,即使文本没有短码。优化构建实测:连续 `&` 构成的 128 KiB 段落,仅 `emoji` 扫描就需约 260 ms;1 MiB 需 16.1 秒,而 markdown-rs 解析该 1 MiB 仅需约 230 ms。文档不超过 128 KiB 时走同步解析,已超过 PRD 的 100 ms 主线程阻塞上限。应按字符引用的合法字符及长度界限扫描,遇非法字符即停止,避免对每个 `&` 重扫后缀,并覆盖长文本的增长行为。数据见 `.work/R4.2-r2/probes.log`。
2. [P2] `../Ely-GPUI-Components/src/documents/tree/html.rs:117` — HTML 属性复用了 CommonMark 字符引用规则,上一轮的普通 `&amp;` 案例已修复,但合法 HTML 地址仍会解错。`<a href="https://x.test/?q=one&#38page=2">result</a>` 的地址仍含 `&#38page=2`,应为 `&page=2`;`<a href="/&#128;">result</a>` 得到 `/�`,HTML 应为 `/€`。Typora 将属性交给 DOM 解析。应区分 HTML 属性与 Markdown 正文的解码规则,覆盖无分号数字引用及 HTML 的控制码映射;保留正文短码的转义语义。失败断言见 `.work/R4.2-r2/confirmed-probes.log`,独立 HTML5 解析结果见 `html-oracle.log`。
3. [P2] `../Ely-GPUI-Components/src/documents/tree/html.rs:194` — 直接使用 `emojis` 的短码表,未覆盖 Typora 1.14.10 的默认名称和含义。实测 `:blonde_man:`、`:person_with_blond_hair:`、`:person_with_pouting_face:`、`:person_frowning:` 全部保持源码,Typora 分别输出 👱、👱、🙎、🙍;`:cricket:` 则由 Typora 的板球 🏏 变成昆虫 🦗。应对齐指定版本的短码映射,并对这些名称及含义建立回归断言。证据见 `.work/R4.2-r2/confirmed-probes.log` 与 `typora-tokenizer.log`,原表在 `frame.js:22342` 起。
4. [P2] `../Ely-GPUI-Components/src/documents/tree/mod.rs:124` — HTML 关闭标签只能匹配当前 Markdown 容器内的打开标签,配合先解析 Markdown 的顺序,会忽略有效的 `</u>` 并让样式延伸至段落末尾。实测 `a <u>*text</u> outside* end` 显示为 `a text outside end`,`text outside` 被斜体化,连 `end` 都带下划线。Typora 的 `underline` 规则先匹配整对 `<u>...</u>`:应显示 `a *text outside* end`,仅 `*text` 带下划线。应按该规则处理标签与 Markdown 的解析优先级,确保关闭位置及字面标记正确,并加入交叉边界测试。两侧结果见 `.work/R4.2-r2/confirmed-probes.log`、`typora-tokenizer.log`。
5. [P2] `../Ely-GPUI-Components/src/documents/tree/html.rs:85` — 无引号属性值以所有 Unicode 空白为分隔符,会截断 HTML 允许出现在值内的字符。在 `/a` 与 `b` 之间放实际的 U+00A0:`See <a href=/a b>result</a>.`,实测链接目标只剩 `/a`;Typora 的标签规则和 HTML5 解析均保留完整 `/a b`。应按 HTML 的 ASCII 空白规则读取、跳过属性分隔符,保留其余 Unicode 字符,并断言完整地址。证据见 `.work/R4.2-r2/confirmed-probes.log`、`html-oracle.log`。
6. [P2] `../Ely-GPUI-Components/src/documents/tree/mod.rs:114` — `br` 的开始和关闭标签都无条件追加换行。实测 `before<br></br>after` 变成两次换行,多出空行;Typora 的 `br` 规则将 `<br></br>` 合成一个换行词元。应按该规则处理紧随的关闭标签,避免重复换行,并补配对写法的回归测试。失败断言及原分词结果见 `.work/R4.2-r2/confirmed-probes.log`、`typora-tokenizer.log`。
清理例外:自动审批审查拒绝了已校验路径的 PowerShell 删除命令,仅返回 `blocked by policy`。已通过 `cargo clean` 删除两个独立构建目录;仍留有项目内 `.work/R4.2-r2/source/`、`parser/`、`html-oracle/`、`tmp/`、`source.tar`、`typora-tokenizer.cjs`。本轮完整库测试 1878 项通过,原生及 WebAssembly Clippy、格式检查通过;上一轮原始失败断言全部通过,记录在 `.work/R4.2-r2/validation.log`。