`arc` + space + trig name is not merged

未关闭
#957 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
1-2 天
新手友好度
45/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
rust

调研方向

Start in src/canonicalize.rs at merge_arc_trig and read the existing canonicalization tests around clean_up_arc_lookalike_mrow. Run the proposed clean_up_arc_mspace case to check how the spaced MathML is canonicalized. Done means arc plus a space and trig name merges correctly while arc followed by a cosine function stays separate; the Spanish workaround in Rules/Languages/es/SharedRules/general.yaml can then be removed.

由索引模型根据 Issue 内容生成。

描述

babel (Spanish) writes \arcsen as arc\,sen, and arc\,cos gives the same in English:

<math><mi>arc</mi><mi>cos</mi><mi>x</mi></math>
<math><mi>arc</mi><mspace width="0.167em"/><mi>cos</mi><mspace width="0.167em"/><mi>x</mi></math>
  • without space: arccos of x
  • with space: arc of cosine x

merge_arc_trig runs while the mspace is still a sibling. Skipping whitespace before checking the next sibling should fix it. Spanish has a temporary rule for this in general.yaml (from #945), to be removed once fixed.

Proposed patch (tested: cargo test passes; adds the test clean_up_arc_mspace):

diff --git a/src/canonicalize.rs b/src/canonicalize.rs
index 00a5165b..4f34bfd8 100644
--- a/src/canonicalize.rs
+++ b/src/canonicalize.rs
@@ -1793,12 +1793,21 @@ impl CanonicalizeContext {
 				return None;
 			}
 
+			// skip whitespace between "arc" and the trig name (e.g., babel writes \arcsen as arc\,sen)
 			let following_siblings = leaf.following_siblings();
-			if following_siblings.is_empty() {
-				return None;
+			let mut whitespace = Vec::new();
+			let mut following_sibling = None;
+			for &child in &following_siblings {
+				let child = as_element(child);
+				let child_name = name(child);
+				if child_name == "mspace" || (child_name == "mtext" && as_text(child).trim().is_empty()) {
+					whitespace.push(child);
+				} else {
+					following_sibling = Some(child);
+					break;
+				}
 			}
-
-			let following_sibling = as_element(following_siblings[0]);
+			let following_sibling = following_sibling?;
 			let following_sibling_name = name(following_sibling);
 			if !(following_sibling_name == "mi" || following_sibling_name == "mo" || following_sibling_name == "mtext") {
 				return None;
@@ -1811,6 +1820,7 @@ impl CanonicalizeContext {
 					let new_text = "arc".to_string() + as_str!(following_text);
 					set_mathml_name(leaf, "mi");
 					leaf.set_text(&new_text);
+					whitespace.iter().for_each(|ws| ws.remove_from_parent());
 					following_sibling.remove_from_parent();
 					return Some(leaf);
 				}
@@ -6207,6 +6217,14 @@ mod canonicalize_tests {
         are_strs_canonically_equal_result(test_str, target_str, &[])
 	}
 
+	#[test]
+    fn clean_up_arc_mspace() -> Result<()> {
+        // babel writes \arcsen as arc\,sen
+        let test_str = "<math><mi>arc</mi><mspace width='0.167em'/><mi>cos</mi><mspace width='0.167em'/><mi>x</mi></math>";
+        let target_str = "<math><mrow data-changed='added'><mi>arccos</mi><mo data-changed='added'>&#x2061;</mo><mi data-previous-space-width='0.167'>x</mi></mrow></math>";
+        are_strs_canonically_equal_result(test_str, target_str, &[])
+	}
+
 	#[test]
     fn clean_up_arc_lookalike_mrow() -> Result<()> {
         // Frown over two capital identifiers is rewritten to the arc operator (U+2312)

With this, the Spanish workaround in Rules/Languages/es/SharedRules/general.yaml (the three arc-trig-separado* rules) can be removed. I have that change ready too: one Spanish test changes a pause (arco tangente; → arco tangente,, now the same as arctg), and if the Spanish navigation PR is merged first, zoom_in_all_babel_arc should expect acercado al máximo; arco seno instead of …; arc.

主要语言
Rust
星标
130
派生
96
平均合并
1 天 1 小时
30 天内合并 PR
84

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

daisy/MathCAT 的其他 Issue

查看 daisy/MathCAT 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。