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