diff --git a/apps/ely-table/src/figures.rs b/apps/ely-table/src/figures.rs index a1d5c35..9f42fb8 100644 --- a/apps/ely-table/src/figures.rs +++ b/apps/ely-table/src/figures.rs @@ -58,8 +58,8 @@ pub fn label(status: &str, cx: &App) -> SharedString { if let Some((_, key)) = ERRORS.iter().find(|(known, _)| *known == status) { return Book::text(cx, key, &[]); } - let parts: Vec = status - .split("; ") + let parts: Vec = fields(status) + .into_iter() .map(|part| { let known = part.split_once(": ").and_then(|(name, value)| { let (_, key) = FIGURES.iter().find(|(known, _)| *known == name)?; @@ -74,6 +74,24 @@ pub fn label(status: &str, cx: &App) -> SharedString { parts.join(" ").into() } +/// The status split at each "Name: "; values keep semicolons. +fn fields(status: &str) -> Vec<&str> { + let starts = |rest: &str| { + rest.split_once(": ") + .is_some_and(|(name, _)| !name.is_empty() && name.chars().all(|c| c.is_ascii_alphabetic() || c == ' ')) + }; + let mut out = Vec::new(); + let mut from = 0; + for (at, _) in status.match_indices("; ") { + if starts(&status[at + 2..]) { + out.push(&status[from..at]); + from = at + 2; + } + } + out.push(&status[from..]); + out +} + #[cfg(test)] mod tests { #[test] @@ -91,6 +109,8 @@ mod tests { assert_eq!(label.as_ref(), expect, "known names relabel, others stay"); // The kernel's formatted values pass through untouched. ely_ui::i18n::install_as("en-US", app); + let custom = super::label("Average: 8128.00 kg; net; Sum: 16256.00 kg; net", app); + assert_eq!(custom.as_ref(), "Average 8128.00 kg; net Sum 16256.00 kg; net", "a format's own semicolons stay"); for value in ["8128.00", "8128.33333333333", "0.0000000001", "1234567890.25", "$1,234.50"] { assert_eq!(super::label(&format!("Sum: {value}"), app).as_ref(), format!("Sum {value}")); } diff --git a/tasks/reviews/R2.12-r3.md b/tasks/reviews/R2.12-r3.md new file mode 100644 index 0000000..43f2d72 --- /dev/null +++ b/tasks/reviews/R2.12-r3.md @@ -0,0 +1,11 @@ +FAIL + +../Ely-GPUI-Components/src/forms/syntax.rs:15 — 语言词表仍有跨语言混用,上一轮第二项的根因修复仍有遗漏。Python 的 `assert ready and True` 与 TOML 的 `return = 42` 已按预期着色;Rust 的合法代码 `let from = 42;` 却把普通变量 `from` 着为 keyword,Ruby 的 `def hello; puts true; end` 把 `def` 着为 variable(145 行 HASH 沿用 C_LIKE,且新表删掉了原表中的 def)。rustc 与 Ruby 均成功执行这些代码,定向探针记录实际 HighlightStyle,原生窗口两种布局均确认 Rust 的错误颜色。证据:/tmp/R2.12-r3-language.log、/tmp/R2.12-r3-parser.log、/tmp/R2.12-r3-native.log。修复方向:按实际语言选择关键字表,覆盖普通同名变量与 Ruby 定义关键字的颜色回归。 + +../Ely-GPUI-Components/src/forms/syntax.rs:164 — 新扩展名表遗漏了上一版已有的 Haskell 与 Erlang 注释映射,211 行将它们退回 C_LIKE,造成着色回归。复现:`main.hs` 的 `-- return 42`、`main.erl` 的 `% return 42` 原本整行是 comment,现在将 return 着为 keyword、42 着为 number。原生 DiffViewer 与相同文本的正确注释着色对照,行内/并排分别相差 839/1678、933/1866 个文本像素。证据:/tmp/R2.12-r3-language.log、/tmp/R2.12-r3-render.log。修复方向:迁移时保留原有语言的注释规则,并增加覆盖被迁移扩展名的实际颜色断言。 + +../Ely-GPUI-Components/src/forms/syntax.rs:102 — TOML 被设置为仅在空白后识别注释,198 行的 CMakeLists.txt 又被归入具有同一限制的 SHELL,合法的紧接代码注释被当作代码。上一轮 `# return 42` 的 CMake 文件名复现已通过,但 `CMakeLists.txt` 中的 `set(x 1)# return 42` 与 `config.toml` 中的 `answer = 42# return 99` 仍分别把注释里的 return、数字着为代码;cmake 成功执行,tomllib 成功解析出 answer=42。相同 CMake 行在 build.cmake 中着色正确;CMake 主文件与它在行内/并排相差 902/1804 个文本像素,TOML 注释与正确注释对照相差 922/1844 个文本像素。证据:/tmp/R2.12-r3-parser.log、/tmp/R2.12-r3-language.log、/tmp/R2.12-r3-render.log。修复方向:分别配置 TOML 与 CMake 的注释起始条件,并覆盖代码后紧接 # 的场景。 + +../Ely-GPUI-Components/src/forms/code.rs:82 — Shell 的注释边界只认可行首与空白,遗漏控制操作符结束词的情况。上一轮 `echo foo#bar 42` 的词中 # 已修复;有效 Shell 代码 `echo x;# return 42` 在 Bash 中只输出 x,DiffViewer 却将注释中的 return 着为 keyword、42 着为 number。两种原生布局均复现,与正确注释颜色对照的文本像素差为 910/1820。证据:/tmp/R2.12-r3-parser.log、/tmp/R2.12-r3-language.log、/tmp/R2.12-r3-render.log。修复方向:依 Shell 的词法边界识别注释起点,覆盖分号等操作符后的注释,同时保留词中 # 的回归。 + +../Ely-GPUI-Components/src/git/rows.rs:201 — 新回归只读取构造器保存的 syntax,上一轮第四项要求的实际渲染接线覆盖仍然缺失。复现:在隔离副本中将 viewer.rs:202 的 `let syntax = self.syntax;` 改成 `let syntax = crate::forms::syntax_of("forced.rs");`,执行 `cargo test --lib --features test-support --offline --locked`,1727 项测试仍全部通过;原生 DiffViewer 的 Markdown 在行内、并排重新出现代码颜色,文本区域分别改变 1073、1780 个像素,Python/TOML 注释也被错误着色。证据:/tmp/R2.12-r3-mutation-test.log、/tmp/R2.12-r3-mutation-native.log、/tmp/R2.12-r3-render.log。基线 ElyTree 检查、构建与 111 项测试、组件库 1727 项测试通过;探针副本与独立 target 已删除,原始组件库与本次审查范围源码散列一致(/tmp/R2.12-r3-cleanup.log)。修复方向:增加经过 DiffViewer 两种布局的文本颜色断言,让渲染接收错误语言类型的突变触发失败。