aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-06-17 15:49:04 +0100
committerMichael Williamson <mike@zwobble.org>2015-06-17 15:49:04 +0100
commit3bfa77d64e69d20609c8321a067bfa2651a7eabc (patch)
tree4cab2b0ff450665c3b164a27292b18583c339059
parent6478f5c20b86534c471793041f4e5b46f0cd6484 (diff)
Add support for strikethrough
-rw-r--r--mammoth/conversion.py2
-rw-r--r--mammoth/documents.py6
-rw-r--r--mammoth/docx/document_xml.py2
-rw-r--r--tests/conversion_tests.py8
-rw-r--r--tests/docx/document_xml_tests.py10
-rw-r--r--tests/mammoth_tests.py7
-rwxr-xr-xtests/test-data/strikethrough.docxbin0 -> 12652 bytes
7 files changed, 32 insertions, 3 deletions
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("<strong><em>Hello</em></strong>", 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("<s>Hello</s>", 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
@@ -131,6 +131,13 @@ def underline_can_be_configured_with_style_mapping():
@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("<p><s>Today's Special: Salmon</s> Sold out</p>", result.value)
+
+
+@istest
def transform_document_is_applied_to_document_before_conversion():
def transform_document(document):
document.children[0].style_id = "Heading1"
diff --git a/tests/test-data/strikethrough.docx b/tests/test-data/strikethrough.docx
new file mode 100755
index 0000000..0d2b713
--- /dev/null
+++ b/tests/test-data/strikethrough.docx
Binary files differ