`arc` + space + trig name is not merged

Abierto
#957 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
1-2 días
Aptitud para principiantes
45/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
rust

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
Rust
Estrellas
130
Forks
96
Merge medio
1 d 1 h
PR fusionados (30 d)
84

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de daisy/MathCAT

Todos los issues de daisy/MathCAT

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.