This is an automated email from the ASF dual-hosted git repository.

tballison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/main by this push:
     new 043762c632 TIKA-4968: rename OMML span to class=omml; keep it across 
hyperlinks (#3366)
043762c632 is described below

commit 043762c6327ff36b3081ce297688e93915c85996
Author: Tim Allison <[email protected]>
AuthorDate: Mon Oct 19 15:36:11 2026 +0100

    TIKA-4968: rename OMML span to class=omml; keep it across hyperlinks (#3366)
---
 CHANGES.txt                                        |   4 +++
 .../microsoft/ooxml/FormattingTagManager.java      |  39 +++++++++++++--------
 .../parser/microsoft/ooxml/OOXMLDocxSAXTest.java   |   9 +++--
 .../resources/test-documents/testWORD_omml.docx    | Bin 1067 -> 1113 bytes
 4 files changed, 34 insertions(+), 18 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 4946d32dbf..2f47a3e631 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,9 @@
 Release 4.2.0 - unreleased
 
+   * The docx parser wraps OMML equations (m:oMath) in <span class="omml">, 
their
+     text flattened to plain characters; it was previously emitted as unmarked 
body
+     text (TIKA-4968).
+     
    * Files named *.rs are now detected as text/x-rust (Rust source) instead of
      application/rls-services+xml. RLS services XML is still detected from its
      root element, whatever the file name (TIKA-4977).
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/FormattingTagManager.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/FormattingTagManager.java
index 9c77492064..baf80e24aa 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/FormattingTagManager.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/FormattingTagManager.java
@@ -46,7 +46,9 @@ class FormattingTagManager {
 
     // Outermost to innermost: hyperlink > math > span > bold > italic > 
strike > underline
     private String currentHyperlink = null;
-    private boolean isMath = false;
+    // inMath spans the equation; mathSpanOpen tracks the span, which a 
hyperlink change closes
+    private boolean inMath = false;
+    private boolean mathSpanOpen = false;
     private String currentSpanClass = null;
     private boolean wrapperHyperlinkActive = false;
     private boolean isBold = false;
@@ -123,6 +125,12 @@ class FormattingTagManager {
             }
         }
 
+        if (inMath && !mathSpanOpen) {
+            closeStyledTags();
+            xhtml.startElement("span", "class", "omml");
+            mathSpanOpen = true;
+        }
+
         if (!Objects.equals(spanClass, currentSpanClass)) {
             closeStyledTags();
             if (spanClass != null) {
@@ -197,24 +205,17 @@ class FormattingTagManager {
     }
 
     /**
-     * Opens {@code <span class="math">} for an OMML equation. A hyperlink 
change inside
-     * the equation closes it.
+     * Starts an OMML equation, whose text is flattened to plain characters: 
each of its
+     * runs is wrapped in {@code <span class="omml">}, reopened inside any 
hyperlink that
+     * starts or ends mid-equation.
      */
     void openMath() throws SAXException {
-        if (isMath) {
-            return;
-        }
-        closeStyledTags();
-        xhtml.startElement("span", "class", "math");
-        isMath = true;
+        inMath = true;
     }
 
     void closeMath() throws SAXException {
-        if (isMath) {
-            closeStyledTags();
-            xhtml.endElement("span");
-            isMath = false;
-        }
+        closeMathSpan();
+        inMath = false;
     }
 
     /**
@@ -231,7 +232,15 @@ class FormattingTagManager {
 
     private void closeInlineTags() throws SAXException {
         closeStyledTags();
-        closeMath();
+        closeMathSpan();
+    }
+
+    private void closeMathSpan() throws SAXException {
+        if (mathSpanOpen) {
+            closeStyledTags();
+            xhtml.endElement("span");
+            mathSpanOpen = false;
+        }
     }
 
     private void closeStyledTags() throws SAXException {
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLDocxSAXTest.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLDocxSAXTest.java
index 03ba3d3b3c..aa0bdb7608 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLDocxSAXTest.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLDocxSAXTest.java
@@ -148,9 +148,12 @@ public class OOXMLDocxSAXTest extends TikaTest {
     @Test
     public void testOmmlMath() throws Exception {
         String xml = getXML("testWORD_omml.docx").xml;
-        assertContains("<p>area <span class=\"math\">A=<b>π</b>rr2</span> 
done</p>", xml);
-        assertContains("<p><span class=\"math\">x+y</span></p>", xml);
-        assertContains("<p><b>bold </b><span class=\"math\">z</span><b> 
after</b></p>", xml);
+        assertContains("<p>area <span class=\"omml\">A=<b>π</b>rr2</span> 
done</p>", xml);
+        assertContains("<p><span class=\"omml\">x+y</span></p>", xml);
+        assertContains("<p><b>bold </b><span class=\"omml\">z</span><b> 
after</b></p>", xml);
+        assertContains("<p><span class=\"omml\">a</span><a href=\"#eq\"><span 
class=\"omml\">b</span></a>"
+                + "<span class=\"omml\">c</span></p>", xml);
+        assertContains("<p>empty</p>", xml);
     }
 
     @Test
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testWORD_omml.docx
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testWORD_omml.docx
index bde754a670..237d18362f 100644
Binary files 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testWORD_omml.docx
 and 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testWORD_omml.docx
 differ

Reply via email to