diff --git a/src/xpath_functions.rs b/src/xpath_functions.rs
index a713fad8..f3454dae 100644
--- a/src/xpath_functions.rs
+++ b/src/xpath_functions.rs
@@ -81,30 +81,10 @@ impl IsNode {
/// this is fairly detailed, so we define a few local functions (at end) to help out
/// Also, it doesn't help that the structure is a bit complicated Elements->ChildOfElement->Element/Text
pub fn is_simple(elem: Element) -> bool {
- if is_trivially_simple(elem) {
- return true;
- }
-
- if is_negative_of_trivially_simple(elem) {
- // -3 or -x
- return true;
- }
-
- if !is_tag(elem, "mrow") || elem.children().is_empty() {
- return false;
- }
-
- // x y or -x or -3 x or -x y or -3 x y or x° or n° or -x° or -n°
- #[allow(clippy::if_same_then_else)]
- if is_times_mi(elem) {
- return true; // x y
- } else if is_degrees(elem) {
- return true; // x° or n°
- } else if is_function(elem) {
- return true;
- }
-
- return false;
+ return is_trivially_simple(elem)
+ || is_negative_of_trivially_simple(elem)
+ || (is_tag(elem, "mrow")
+ && (is_times_mi(elem) || is_degrees(elem) || is_function(elem)));
// returns the element's text value
@@ -139,19 +119,10 @@ impl IsNode {
// checks the single element to see if it is simple (mn, mi that is a single char, common fraction)
fn is_trivially_simple(elem: Element) -> bool {
- if is_tag(elem, "mn") {
- return true;
- }
- if is_tag(elem, "mi") && is_single_char(&to_str(elem)) {
- // "simple" only if it is a single char (which can be multiple bytes)
- return true;
- }
-
// FIX: need to consult preference Fraction_Ordinal
- if IsNode::is_common_fraction(elem, 10, 19) {
- return true;
- }
- return false;
+ is_tag(elem, "mn")
+ || (is_tag(elem, "mi") && is_single_char(&to_str(elem)))
+ || IsNode::is_common_fraction(elem, 10, 19)
}
// true if the negative of a single element that is simple
@@ -1957,6 +1928,18 @@ mod tests {
});
}
+ /// Degree forms are simple, while longer products and identifiers exceed the limit.
+ #[test]
+ fn is_simple_shape_boundaries() -> Result<()> {
+ xpath_test(|| {
+ test_is_simple("variable with degrees", "x°")?;
+ test_is_simple("number with degrees", "30°")?;
+ test_is_not_simple("longer product", "xyz")?;
+ test_is_not_simple("non-simple function argument", "fx")?;
+ Ok(())
+ })
+ }
+
fn check_table_dims(mathml: &str, dims: (usize, usize)) -> Result<()> {
let package = parser::parse(mathml).map_err(|e| anyhow::anyhow!("failed to parse XML: {e}"))?;
let math_elem = get_element(&package);