summaryrefslogtreecommitdiff
path: root/mammoth
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2019-03-17 16:50:46 +0000
committerMichael Williamson <mike@zwobble.org>2019-03-17 16:51:10 +0000
commit20c1fea1a37ac39f3114775facad74644435253e (patch)
tree061cb9cc4dee8c5be07b0068300af2d9c6c10b92 /mammoth
parent49618f540107bf3084e93fda426746818e74418d (diff)
Read numbering styles
Diffstat (limited to 'mammoth')
-rw-r--r--mammoth/docx/styles_xml.py61
1 files changed, 51 insertions, 10 deletions
diff --git a/mammoth/docx/styles_xml.py b/mammoth/docx/styles_xml.py
index 3339bb6..937f852 100644
--- a/mammoth/docx/styles_xml.py
+++ b/mammoth/docx/styles_xml.py
@@ -2,25 +2,48 @@ import collections
class Styles(object):
- def __init__(self, paragraph_styles, character_styles, table_styles):
+ @staticmethod
+ def create(paragraph_styles=None, character_styles=None, table_styles=None, numbering_styles=None):
+ if paragraph_styles is None:
+ paragraph_styles = {}
+ if character_styles is None:
+ character_styles = {}
+ if table_styles is None:
+ table_styles = {}
+ if numbering_styles is None:
+ numbering_styles = {}
+
+ return Styles(
+ paragraph_styles=paragraph_styles,
+ character_styles=character_styles,
+ table_styles=table_styles,
+ numbering_styles=numbering_styles,
+ )
+
+ def __init__(self, paragraph_styles, character_styles, table_styles, numbering_styles):
self._paragraph_styles = paragraph_styles
self._character_styles = character_styles
self._table_styles = table_styles
-
+ self._numbering_styles = numbering_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 find_table_style_by_id(self, style_id):
return self._table_styles.get(style_id)
+ def find_numbering_style_by_id(self, style_id):
+ return self._numbering_styles.get(style_id)
+
Styles.EMPTY = Styles(
paragraph_styles={},
character_styles={},
table_styles={},
+ numbering_styles={},
)
@@ -28,30 +51,48 @@ def read_styles_xml_element(element):
paragraph_styles = {}
character_styles = {}
table_styles = {}
+ numbering_styles = {}
styles = {
"paragraph": paragraph_styles,
"character": character_styles,
"table": table_styles,
}
-
+
for style_element in element.find_children("w:style"):
style = _read_style_element(style_element)
element_type = style_element.attributes["w:type"]
- style_set = styles.get(element_type)
- if style_set is not None:
- style_set[style.style_id] = style
-
+ if element_type == "numbering":
+ numbering_styles[style.style_id] = _read_numbering_style_element(style_element)
+ else:
+ style_set = styles.get(element_type)
+ if style_set is not None:
+ style_set[style.style_id] = style
+
return Styles(
paragraph_styles=paragraph_styles,
character_styles=character_styles,
table_styles=table_styles,
+ numbering_styles=numbering_styles,
)
+Style = collections.namedtuple("Style", ["style_id", "name"])
+
+
def _read_style_element(element):
style_id = element.attributes["w:styleId"]
name = element.find_child_or_null("w:name").attributes.get("w:val")
return Style(style_id=style_id, name=name)
-Style = collections.namedtuple("Style", ["style_id", "name"])
+NumberingStyle = collections.namedtuple("NumberingStyle", ["num_id"])
+
+
+def _read_numbering_style_element(element):
+ num_id = element \
+ .find_child_or_null("w:pPr") \
+ .find_child_or_null("w:numPr") \
+ .find_child_or_null("w:numId") \
+ .attributes.get("w:val")
+
+ return NumberingStyle(num_id=num_id)