aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--mammoth/docx/styles_xml.py2
-rw-r--r--tests/docx/styles_xml_tests.py23
3 files changed, 25 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index cb06b60..b706f71 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+# 0.3.15
+
+* Support styles defined without a name
+
# 0.3.14
* Add ignore_empty_paragraphs option, which defaults to True.
diff --git a/mammoth/docx/styles_xml.py b/mammoth/docx/styles_xml.py
index ab3cc0f..1166f11 100644
--- a/mammoth/docx/styles_xml.py
+++ b/mammoth/docx/styles_xml.py
@@ -33,7 +33,7 @@ def read_styles_xml_element(element):
def _read_style_element(element):
style_id = element.attributes["w:styleId"]
- name = element.find_child("w:name").attributes["w:val"]
+ name = element.find_child_or_null("w:name").attributes.get("w:val")
return Style(style_id=style_id, name=name)
diff --git a/tests/docx/styles_xml_tests.py b/tests/docx/styles_xml_tests.py
index 2f04ade..94d91ce 100644
--- a/tests/docx/styles_xml_tests.py
+++ b/tests/docx/styles_xml_tests.py
@@ -58,6 +58,17 @@ def styles_include_names():
)
+@istest
+def style_name_is_none_if_name_element_does_not_exist():
+ element = xml_element("w:styles", {}, [
+ _style_without_name_element("paragraph", "Heading1"),
+ _style_without_name_element("character", "Heading1Char")
+ ])
+ styles = read_styles_xml_element(element)
+ assert_equal(None, styles.find_paragraph_style_by_id("Heading1").name)
+ assert_equal(None, styles.find_character_style_by_id("Heading1Char").name)
+
+
def _paragraph_style_element(style_id, name):
return _style_element("paragraph", style_id, name)
@@ -65,6 +76,12 @@ def _character_style_element(style_id, name):
return _style_element("character", style_id, name)
def _style_element(element_type, style_id, name):
- return xml_element("w:style", {"w:type": element_type, "w:styleId": style_id}, [
- xml_element("w:name", {"w:val": name}, [])
- ])
+ children = [xml_element("w:name", {"w:val": name}, [])]
+ return _style_element_with_children(element_type, style_id, children)
+
+def _style_without_name_element(element_type, style_id):
+ return _style_element_with_children(element_type, style_id, [])
+
+def _style_element_with_children(element_type, style_id, children):
+ attributes = {"w:type": element_type, "w:styleId": style_id}
+ return xml_element("w:style", attributes, children)