aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2025-06-08 14:18:25 +0100
committerMichael Williamson <mike@zwobble.org>2025-06-08 14:18:25 +0100
commit0e76641e1f84622e3441b1aadd954f7707b0f16f (patch)
treea632e4b18647e3519db749d875087be5501305c6 /src
parent7fa2cbcfafd1acf12d288a578ee52dc893d2b874 (diff)
Ignore deleted table rows
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java7
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java41
2 files changed, 48 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java
index 30579ff..76d01b9 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java
@@ -562,6 +562,13 @@ class StatefulBodyXmlReader {
private ReadResult readTableRow(XmlElement element) {
XmlElementLike properties = element.findChildOrEmpty("w:trPr");
+
+ // See 17.13.5.12 del (Deleted Table Row) of ECMA-376 4th edition Part 1
+ boolean deleted = properties.hasChild("w:del");
+ if (deleted) {
+ return ReadResult.EMPTY_SUCCESS;
+ }
+
boolean isHeader = properties.hasChild("w:tblHeader");
return readElements(element.getChildren())
.map(children -> list(new TableRow(children, isHeader)));
diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
index a4b3bdd..2c8c96c 100644
--- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
@@ -1489,6 +1489,47 @@ public class BodyXmlTests {
}
@Test
+ public void whenRowIsMarkedAsDeletedInRowPropertiesThenRowIsIgnored() {
+ XmlElement element = element("w:tbl", list(
+ element("w:tr", list(
+ element("w:tc", list(
+ element("w:p", list(
+ runXml("Row 1")
+ ))
+ ))
+ )),
+
+ element("w:tr", list(
+ element("w:trPr", list(
+ element("w:del")
+ )),
+ element("w:tc", list(
+ element("w:p", list(
+ runXml("Row 2")
+ ))
+ ))
+ ))
+ ));
+
+ DocumentElement result = readSuccess(bodyReader(), element);
+
+ assertThat(
+ result,
+ deepEquals(table(list(
+ tableRow(list(
+ tableCell(
+ withChildren(
+ paragraph(withChildren(
+ runWithText("Row 1")
+ ))
+ )
+ )
+ ))
+ )))
+ );
+ }
+
+ @Test
public void warningIfNonRowInTable() {
XmlElement element = element("w:tbl", list(
element("w:p")