diff options
| -rw-r--r-- | mammoth/docx/styles_xml.py | 20 | ||||
| -rw-r--r-- | tests/docx/styles_xml_tests.py | 31 |
2 files changed, 45 insertions, 6 deletions
diff --git a/mammoth/docx/styles_xml.py b/mammoth/docx/styles_xml.py index 548c3e1..22c8899 100644 --- a/mammoth/docx/styles_xml.py +++ b/mammoth/docx/styles_xml.py @@ -2,26 +2,36 @@ import collections class Styles(object): - def __init__(self, paragraph_styles): + def __init__(self, paragraph_styles, character_styles): self._paragraph_styles = paragraph_styles + self._character_styles = character_styles def find_paragraph_style_by_id(self, style_id): return self._paragraph_styles.get(style_id) + + def find_character_style_by_id(self, style_id): + return self._character_styles.get(style_id) def read_styles_xml_element(element): paragraph_styles = {} + character_styles = {} + styles = { + "paragraph": paragraph_styles, + "character": character_styles, + } for style_element in element.find_children("w:style"): style = _read_style_element(style_element) - paragraph_styles[style.style_id] = style + styles[style.element_type][style.style_id] = style - return Styles(paragraph_styles) + return Styles(paragraph_styles, character_styles) def _read_style_element(element): + element_type = element.attributes["w:type"] style_id = element.attributes["w:styleId"] - return Style(style_id=style_id) + return Style(element_type=element_type, style_id=style_id) -Style = collections.namedtuple("Style", "style_id") +Style = collections.namedtuple("Style", ["element_type", "style_id"]) diff --git a/tests/docx/styles_xml_tests.py b/tests/docx/styles_xml_tests.py index 7e58333..c4f659d 100644 --- a/tests/docx/styles_xml_tests.py +++ b/tests/docx/styles_xml_tests.py @@ -17,12 +17,41 @@ def paragraph_style_can_be_found_by_id(): _paragraph_style_element("Heading1", "Heading 1"), ]) styles = read_styles_xml_element(element) - assert_equal("Heading1", styles.find_paragraph_style_by_id("Heading1").style_id) + assert_equal( + "Heading1", + styles.find_paragraph_style_by_id("Heading1").style_id + ) + + +@istest +def character_style_can_be_found_by_id(): + element = xml_element("w:styles", {}, [ + _character_style_element("Heading1Char", "Heading 1 Char"), + ]) + styles = read_styles_xml_element(element) + assert_equal( + "Heading1Char", + styles.find_character_style_by_id("Heading1Char").style_id + ) + + +@istest +def paragraph_and_character_styles_are_distinct(): + element = xml_element("w:styles", {}, [ + _paragraph_style_element("Heading1", "Heading 1"), + _character_style_element("Heading1Char", "Heading 1 Char"), + ]) + styles = read_styles_xml_element(element) + assert_equal(None, styles.find_character_style_by_id("Heading1")) + assert_equal(None, styles.find_paragraph_style_by_id("Heading1Char")) def _paragraph_style_element(style_id, name): return _style_element("paragraph", style_id, name) +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}, []) |
