summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2020-09-09 11:21:47 +0100
committerMichael Williamson <mike@zwobble.org>2020-09-09 11:21:47 +0100
commit32231b57c13c6c7c72d7ab9606cf939b03e38849 (patch)
tree1824666b4a11aa890ba353535fb113a036857e56
parent144515de86dba289edf68ec9acd6fa005fc2a4ed (diff)
Handle underline elements where w:val is "none"
-rw-r--r--NEWS4
-rw-r--r--mammoth/docx/body_xml.py4
-rw-r--r--tests/docx/body_xml_tests.py22
3 files changed, 28 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index caa81ba..4bca755 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+# 1.4.12
+
+* Handle underline elements where w:val is "none".
+
# 1.4.11
* Read font size for runs.
diff --git a/mammoth/docx/body_xml.py b/mammoth/docx/body_xml.py
index f0aab84..dcc704b 100644
--- a/mammoth/docx/body_xml.py
+++ b/mammoth/docx/body_xml.py
@@ -89,7 +89,7 @@ def _create_reader(numbering, content_types, relationships, styles, docx_file, f
is_bold = read_boolean_element(properties.find_child("w:b"))
is_italic = read_boolean_element(properties.find_child("w:i"))
- is_underline = read_boolean_element(properties.find_child("w:u"))
+ is_underline = read_underline_element(properties.find_child("w:u"))
is_strikethrough = read_boolean_element(properties.find_child("w:strike"))
is_small_caps = read_boolean_element(properties.find_child("w:smallCaps"))
@@ -123,6 +123,8 @@ def _create_reader(numbering, content_types, relationships, styles, docx_file, f
def read_boolean_element(element):
return element and element.attributes.get("w:val") not in ["false", "0"]
+ def read_underline_element(element):
+ return element and element.attributes.get("w:val") not in ["false", "0", "none"]
def paragraph(element):
properties = element.find_child_or_null("w:pPr")
diff --git a/tests/docx/body_xml_tests.py b/tests/docx/body_xml_tests.py
index c9863bf..746259c 100644
--- a/tests/docx/body_xml_tests.py
+++ b/tests/docx/body_xml_tests.py
@@ -252,11 +252,31 @@ class RunTests(object):
assert_equal(False, run.is_underline)
@istest
- def run_is_underlined_if_underline_element_is_present(self):
+ def run_is_underlined_if_underline_element_is_present_without_val_attribute(self):
run = self._read_run_with_properties([xml_element("w:u")])
assert_equal(True, run.is_underline)
@istest
+ def run_is_not_underlined_if_underline_element_is_present_and_val_is_false(self):
+ run = self._read_run_with_properties([xml_element("w:u", {"w:val": "false"})])
+ assert_equal(False, run.is_underline)
+
+ @istest
+ def run_is_not_underlined_if_underline_element_is_present_and_val_is_0(self):
+ run = self._read_run_with_properties([xml_element("w:u", {"w:val": "0"})])
+ assert_equal(False, run.is_underline)
+
+ @istest
+ def run_is_not_underlined_if_underline_element_is_present_and_val_is_none(self):
+ run = self._read_run_with_properties([xml_element("w:u", {"w:val": "none"})])
+ assert_equal(False, run.is_underline)
+
+ @istest
+ def run_is_underlined_if_underline_element_is_present_and_val_is_not_none_or_falsy(self):
+ run = self._read_run_with_properties([xml_element("w:u", {"w:val": "single"})])
+ 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)