`arc` + space + trig name is not merged

Đang mở
#957 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
1-2 ngày
Mức phù hợp với người mới
45/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
rust
Lĩnh vực
accessibility, testing

Hướng nghiên cứu

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.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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.

Ngôn ngữ chính
Rust
Star
130
Fork
96
Merge trung bình
1 ngày 1 giờ
Pull request đã merge (30 ngày)
84

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của daisy/MathCAT

Tất cả issue của daisy/MathCAT

Issue tương tự

Thêm issue về Rust

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.