From 84dcb27be96635789073cc547d6a3b8ee462769e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 8 Jun 2014 21:58:14 +0100 Subject: Add basic style XML reading --- mammoth/docx/styles_xml.py | 27 +++++++++++++++++++++++++++ tests/docx/styles_xml_tests.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 mammoth/docx/styles_xml.py create mode 100644 tests/docx/styles_xml_tests.py diff --git a/mammoth/docx/styles_xml.py b/mammoth/docx/styles_xml.py new file mode 100644 index 0000000..548c3e1 --- /dev/null +++ b/mammoth/docx/styles_xml.py @@ -0,0 +1,27 @@ +import collections + + +class Styles(object): + def __init__(self, paragraph_styles): + self._paragraph_styles = paragraph_styles + + def find_paragraph_style_by_id(self, style_id): + return self._paragraph_styles.get(style_id) + + +def read_styles_xml_element(element): + paragraph_styles = {} + + for style_element in element.find_children("w:style"): + style = _read_style_element(style_element) + paragraph_styles[style.style_id] = style + + return Styles(paragraph_styles) + + +def _read_style_element(element): + style_id = element.attributes["w:styleId"] + return Style(style_id=style_id) + + +Style = collections.namedtuple("Style", "style_id") diff --git a/tests/docx/styles_xml_tests.py b/tests/docx/styles_xml_tests.py new file mode 100644 index 0000000..7e58333 --- /dev/null +++ b/tests/docx/styles_xml_tests.py @@ -0,0 +1,29 @@ +from nose.tools import istest, assert_equal + +from mammoth.docx.xmlparser import element as xml_element +from mammoth.docx.styles_xml import read_styles_xml_element + + +@istest +def paragraph_style_is_null_if_no_style_with_that_id_exists(): + element = xml_element("w:styles") + styles = read_styles_xml_element(element) + assert_equal(None, styles.find_paragraph_style_by_id("Heading1")) + + +@istest +def paragraph_style_can_be_found_by_id(): + element = xml_element("w:styles", {}, [ + _paragraph_style_element("Heading1", "Heading 1"), + ]) + styles = read_styles_xml_element(element) + assert_equal("Heading1", styles.find_paragraph_style_by_id("Heading1").style_id) + + +def _paragraph_style_element(style_id, name): + return _style_element("paragraph", 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}, []) + ]) -- cgit v1.2.3