From 3bfa77d64e69d20609c8321a067bfa2651a7eabc Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 17 Jun 2015 15:49:04 +0100 Subject: Add support for strikethrough --- mammoth/conversion.py | 2 ++ mammoth/documents.py | 6 +++--- mammoth/docx/document_xml.py | 2 ++ tests/conversion_tests.py | 8 ++++++++ tests/docx/document_xml_tests.py | 10 ++++++++++ tests/mammoth_tests.py | 7 +++++++ tests/test-data/strikethrough.docx | Bin 0 -> 12652 bytes 7 files changed, 32 insertions(+), 3 deletions(-) create mode 100755 tests/test-data/strikethrough.docx diff --git a/mammoth/conversion.py b/mammoth/conversion.py index fc35efe..c4631e1 100644 --- a/mammoth/conversion.py +++ b/mammoth/conversion.py @@ -99,6 +99,8 @@ class DocumentConverter(object): run_generator.start("sub") if run.is_underline: self._convert_underline(run_generator) + if run.is_strikethrough: + run_generator.start("s") self._convert_elements_to_html(run.children, run_generator) run_generator.end_all() html_generator.append(run_generator) diff --git a/mammoth/documents.py b/mammoth/documents.py index 0e96c05..f2678ca 100644 --- a/mammoth/documents.py +++ b/mammoth/documents.py @@ -5,7 +5,7 @@ Document = dodge.data_class("Document", ["children", "notes"]) Paragraph = dodge.data_class("Paragraph", ["children", "style_id", "style_name", "numbering"]) Run = dodge.data_class("Run", [ "children", "style_id", "style_name", "is_bold", "is_italic", - "is_underline", "vertical_alignment", + "is_underline", "is_strikethrough", "vertical_alignment", ]) Text = dodge.data_class("Text", ["value"]) Hyperlink = dodge.data_class("Hyperlink", ["href", "anchor", "children"]) @@ -33,12 +33,12 @@ def document(children, notes=None): def paragraph(children, style_id=None, style_name=None, numbering=None): return Paragraph(children, style_id, style_name, numbering) -def run(children, style_id=None, style_name=None, is_bold=None, is_italic=None, is_underline=None, vertical_alignment=None): +def run(children, style_id=None, style_name=None, is_bold=None, is_italic=None, is_underline=None, is_strikethrough=None, vertical_alignment=None): if vertical_alignment is None: vertical_alignment = VerticalAlignment.baseline return Run( children, style_id, style_name, bool(is_bold), bool(is_italic), - bool(is_underline), vertical_alignment, + bool(is_underline), bool(is_strikethrough), vertical_alignment, ) class VerticalAlignment(object): diff --git a/mammoth/docx/document_xml.py b/mammoth/docx/document_xml.py index 84e2790..3147ed4 100644 --- a/mammoth/docx/document_xml.py +++ b/mammoth/docx/document_xml.py @@ -80,6 +80,7 @@ def _create_reader(numbering, content_types, relationships, styles, note_element is_bold = properties.find_child("w:b") is_italic = properties.find_child("w:i") is_underline = properties.find_child("w:u") + is_strikethrough = properties.find_child("w:strike") return _read_xml_elements(element.children) \ .map(lambda children: documents.run( @@ -89,6 +90,7 @@ def _create_reader(numbering, content_types, relationships, styles, note_element is_bold=is_bold, is_italic=is_italic, is_underline=is_underline, + is_strikethrough=is_strikethrough, vertical_alignment=vertical_alignment, )) diff --git a/tests/conversion_tests.py b/tests/conversion_tests.py index 19df77f..1563131 100644 --- a/tests/conversion_tests.py +++ b/tests/conversion_tests.py @@ -200,6 +200,14 @@ def style_mapping_for_underline_runs_does_not_close_parent_elements(): ] ) assert_equal("Hello", result.value) + + +@istest +def strikethrough_runs_are_wrapped_in_s_elements_by_default(): + result = convert_document_element_to_html( + documents.run(children=[documents.text("Hello")], is_strikethrough=True), + ) + assert_equal("Hello", result.value) @istest diff --git a/tests/docx/document_xml_tests.py b/tests/docx/document_xml_tests.py index f0fa5ab..bc6fcfb 100644 --- a/tests/docx/document_xml_tests.py +++ b/tests/docx/document_xml_tests.py @@ -142,6 +142,16 @@ class ReadXmlElementTests(object): def run_is_underlined_if_underline_element_is_present(self): run = self._read_run_with_properties([xml_element("w:u")]) assert_equal(True, run.is_underline) + + @istest + def run_is_not_struckthrough_if_strikethrough_element_is_not_present(self): + run = self._read_run_with_properties([]) + assert_equal(False, run.is_strikethrough) + + @istest + def run_is_struckthrough_if_strikethrough_element_is_present(self): + run = self._read_run_with_properties([xml_element("w:strike")]) + assert_equal(True, run.is_strikethrough) @istest def run_has_baseline_vertical_alignment_if_vertical_alignment_element_is_not_present(self): diff --git a/tests/mammoth_tests.py b/tests/mammoth_tests.py index e7e7e64..84cb6ea 100644 --- a/tests/mammoth_tests.py +++ b/tests/mammoth_tests.py @@ -130,6 +130,13 @@ def underline_can_be_configured_with_style_mapping(): assert_equal('

The Sunset Tree

', result.value) +@istest +def strikethrough_is_converted_to_s_element_by_default(): + with open(test_path("strikethrough.docx"), "rb") as fileobj: + result = mammoth.convert_to_html(fileobj=fileobj) + assert_equal("

Today's Special: Salmon Sold out

", result.value) + + @istest def transform_document_is_applied_to_document_before_conversion(): def transform_document(document): diff --git a/tests/test-data/strikethrough.docx b/tests/test-data/strikethrough.docx new file mode 100755 index 0000000..0d2b713 Binary files /dev/null and b/tests/test-data/strikethrough.docx differ -- cgit v1.2.3