diff options
| author | Michael Williamson <mike@zwobble.org> | 2013-12-01 11:33:58 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2013-12-01 11:33:58 +0000 |
| commit | 8d1cc0932083a686e24ff02c9819e507fbb2cb9f (patch) | |
| tree | 224a71cad9fc8276ef126fbfb2c16ed933190ce9 | |
| parent | dc381b5afcae0994094d49465142e6099dcec86c (diff) | |
Read style from paragraph properties
| -rw-r--r-- | mammoth/docx.py | 19 | ||||
| -rw-r--r-- | tests/docx_tests.py | 8 |
2 files changed, 23 insertions, 4 deletions
diff --git a/mammoth/docx.py b/mammoth/docx.py index 2f383dd..bf4de0b 100644 --- a/mammoth/docx.py +++ b/mammoth/docx.py @@ -47,17 +47,24 @@ def run(element): @handler("w:p") def paragraph(element): - return documents.paragraph(_read_xml_elements(element.children)) + properties = _find_child(element, "w:pPr") + if properties is None: + style_name = None + else: + style_name = _find_child(properties, "w:pStyle").attributes.get("w:val") + + children = _read_xml_elements(element.children) + return documents.paragraph(children, style_name) @handler("w:body") -def paragraph(element): +def body(element): return _read_xml_elements(element.children) @handler("w:document") -def paragraph(element): - body_element = _find(lambda child: child.name == "w:body", element.children) +def document(element): + body_element = _find_child(element, "w:body") return documents.Document(_read_xml_elements(body_element.children)) @@ -67,6 +74,10 @@ def _find(predicate, iterable): return item +def _find_child(element, name): + return _find(lambda child: child.name == name, element.children) + + def _read_xml_elements(elements): return filter(None, map(read_xml_element, elements)) diff --git a/tests/docx_tests.py b/tests/docx_tests.py index 80253fa..792ff14 100644 --- a/tests/docx_tests.py +++ b/tests/docx_tests.py @@ -55,6 +55,14 @@ class ReadXmlElementTests(object): def paragraph_has_no_style_if_it_has_no_properties(self): element = xml_element("w:p") assert_equal(None, docx.read_xml_element(element).style_name) + + @istest + def paragraph_has_style_name_read_from_paragraph_properties_if_present(self): + style_xml = xml_element("w:pStyle", {"w:val": "Heading1"}) + properties_xml = xml_element("w:pPr", {}, [style_xml]) + paragraph_xml = xml_element("w:p", {}, [properties_xml]) + paragraph = docx.read_xml_element(paragraph_xml) + assert_equal("Heading1", paragraph.style_name) @istest def unrecognised_elements_are_ignored(self): |
