aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2014-06-08 22:03:01 +0100
committerMichael Williamson <mike@zwobble.org>2014-06-08 22:03:01 +0100
commitfc4b652532f0611e4cbaaf2b6558a70ff265ef9c (patch)
tree31f5b4cd2f10be120f32dab053353e228b505667
parent84dcb27be96635789073cc547d6a3b8ee462769e (diff)
Distinguish character and paragraph styles
-rw-r--r--mammoth/docx/styles_xml.py20
-rw-r--r--tests/docx/styles_xml_tests.py31
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}, [])