From 3db53874ec83b67df0a313ee870ed5b55a8641cd Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 24 May 2015 09:57:25 +0100 Subject: Support styles without a name --- NEWS | 4 ++++ mammoth/docx/styles_xml.py | 2 +- tests/docx/styles_xml_tests.py | 23 ++++++++++++++++++++--- 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) -- cgit v1.2.3