diff options
| author | Michael Williamson <mike@zwobble.org> | 2025-06-08 14:11:10 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2025-06-08 14:11:10 +0100 |
| commit | bd2cf5a02ec9bf0e6ff877e3a962b236b4143f34 (patch) | |
| tree | edb68889cd3ed190156f19620c99a34c8b29d8d3 | |
| parent | 80e9fd089494996def1e2529d1fa127d3ee796dd (diff) | |
Ignore deleted table row
| -rw-r--r-- | NEWS | 2 | ||||
| -rw-r--r-- | mammoth/docx/body_xml.py | 6 | ||||
| -rw-r--r-- | tests/docx/body_xml_tests.py | 38 |
3 files changed, 46 insertions, 0 deletions
@@ -7,6 +7,8 @@ elements, such as table cells. Previously, the wrapping elements would have been ignored. +* Ignore deleted table rows. + # 1.9.1 * Ignore AlternateContent elements when there is no Fallback element. diff --git a/mammoth/docx/body_xml.py b/mammoth/docx/body_xml.py index 5cef312..f99a799 100644 --- a/mammoth/docx/body_xml.py +++ b/mammoth/docx/body_xml.py @@ -351,6 +351,12 @@ def _create_reader(numbering, content_types, relationships, styles, docx_file, f def table_row(element): properties = element.find_child_or_null("w:trPr") + + # See 17.13.5.12 del (Deleted Table Row) of ECMA-376 4th edition Part 1 + is_deleted = bool(properties.find_child("w:del")) + if is_deleted: + return _empty_result + is_header = bool(properties.find_child("w:tblHeader")) return _read_xml_elements(element.children) \ .map(lambda children: documents.table_row( diff --git a/tests/docx/body_xml_tests.py b/tests/docx/body_xml_tests.py index 994583e..fc677be 100644 --- a/tests/docx/body_xml_tests.py +++ b/tests/docx/body_xml_tests.py @@ -1079,6 +1079,44 @@ class TableTests(object): assert_equal(expected_result, result) + def test_when_row_is_marked_as_deleted_in_row_properties_then_row_is_ignored(self): + element = xml_element("w:tbl", {}, [ + xml_element("w:tr", {}, [ + xml_element("w:tc", {}, [ + xml_element("w:p", {}, [ + _run_element_with_text("Row 1"), + ]), + ]), + ]), + + xml_element("w:tr", {}, [ + xml_element("w:trPr", {}, [ + xml_element("w:del") + ]), + xml_element("w:tc", {}, [ + xml_element("w:p", {}, [ + _run_element_with_text("Row 2"), + ]), + ]), + ]), + ]) + + result = _read_and_get_document_xml_element(element) + + expected_result = documents.table([ + documents.table_row([ + documents.table_cell([ + documents.paragraph([ + documents.run([ + documents.text("Row 1"), + ]), + ]), + ]), + ]), + ]) + assert_equal(expected_result, result) + + def test_warning_if_non_row_in_table(self): element = xml_element("w:tbl", {}, [xml_element("w:p")]) result = _read_document_xml_element(element) |
