aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mammoth/docx/body_xml.py2
-rw-r--r--mammoth/docx/styles_xml.py21
-rw-r--r--tests/docx/body_xml_tests.py20
-rw-r--r--tests/docx/styles_xml_tests.py15
4 files changed, 47 insertions, 11 deletions
diff --git a/mammoth/docx/body_xml.py b/mammoth/docx/body_xml.py
index 12951c9..6577522 100644
--- a/mammoth/docx/body_xml.py
+++ b/mammoth/docx/body_xml.py
@@ -24,7 +24,7 @@ def reader(
):
if styles is None:
- styles = Styles({}, {})
+ styles = Styles.EMPTY
read_all = _create_reader(
numbering=numbering,
diff --git a/mammoth/docx/styles_xml.py b/mammoth/docx/styles_xml.py
index 1166f11..3339bb6 100644
--- a/mammoth/docx/styles_xml.py
+++ b/mammoth/docx/styles_xml.py
@@ -2,23 +2,36 @@ import collections
class Styles(object):
- def __init__(self, paragraph_styles, character_styles):
+ def __init__(self, paragraph_styles, character_styles, table_styles):
self._paragraph_styles = paragraph_styles
self._character_styles = character_styles
+ self._table_styles = table_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)
+
+
+Styles.EMPTY = Styles(
+ paragraph_styles={},
+ character_styles={},
+ table_styles={},
+)
def read_styles_xml_element(element):
paragraph_styles = {}
character_styles = {}
+ table_styles = {}
styles = {
"paragraph": paragraph_styles,
"character": character_styles,
+ "table": table_styles,
}
for style_element in element.find_children("w:style"):
@@ -28,7 +41,11 @@ def read_styles_xml_element(element):
if style_set is not None:
style_set[style.style_id] = style
- return Styles(paragraph_styles, character_styles)
+ return Styles(
+ paragraph_styles=paragraph_styles,
+ character_styles=character_styles,
+ table_styles=table_styles,
+ )
def _read_style_element(element):
diff --git a/tests/docx/body_xml_tests.py b/tests/docx/body_xml_tests.py
index c81fade..ad509c4 100644
--- a/tests/docx/body_xml_tests.py
+++ b/tests/docx/body_xml_tests.py
@@ -62,7 +62,11 @@ class ParagraphTests(object):
properties_xml = xml_element("w:pPr", {}, [style_xml])
paragraph_xml = xml_element("w:p", {}, [properties_xml])
- styles = Styles({"Heading1": Style(style_id="Heading1", name="Heading 1")}, {})
+ styles = Styles(
+ paragraph_styles={"Heading1": Style(style_id="Heading1", name="Heading 1")},
+ character_styles={},
+ table_styles={},
+ )
paragraph = _read_and_get_document_xml_element(paragraph_xml, styles=styles)
assert_equal("Heading1", paragraph.style_id)
@@ -74,9 +78,7 @@ class ParagraphTests(object):
properties_xml = xml_element("w:pPr", {}, [style_xml])
paragraph_xml = xml_element("w:p", {}, [properties_xml])
- styles = Styles({}, {})
-
- result = _read_document_xml_element(paragraph_xml, styles=styles)
+ result = _read_document_xml_element(paragraph_xml, styles=Styles.EMPTY)
paragraph = result.value
assert_equal("Heading1", paragraph.style_id)
assert_equal(None, paragraph.style_name)
@@ -153,7 +155,11 @@ class RunTests(object):
def run_has_style_id_and_name_read_from_run_properties_if_present(self):
style_xml = xml_element("w:rStyle", {"w:val": "Heading1Char"})
- styles = Styles({}, {"Heading1Char": Style(style_id="Heading1Char", name="Heading 1 Char")})
+ styles = Styles(
+ paragraph_styles={},
+ character_styles={"Heading1Char": Style(style_id="Heading1Char", name="Heading 1 Char")},
+ table_styles={},
+ )
run = self._read_run_with_properties([style_xml], styles=styles)
assert_equal("Heading1Char", run.style_id)
@@ -165,9 +171,7 @@ class RunTests(object):
properties_xml = xml_element("w:rPr", {}, [style_xml])
run_xml = xml_element("w:r", {}, [properties_xml])
- styles = Styles({}, {})
-
- result = _read_document_xml_element(run_xml, styles=styles)
+ result = _read_document_xml_element(run_xml, styles=Styles.EMPTY)
run = result.value
assert_equal("Heading1Char", run.style_id)
assert_equal(None, run.style_name)
diff --git a/tests/docx/styles_xml_tests.py b/tests/docx/styles_xml_tests.py
index 94d91ce..d70e068 100644
--- a/tests/docx/styles_xml_tests.py
+++ b/tests/docx/styles_xml_tests.py
@@ -36,6 +36,18 @@ def character_style_can_be_found_by_id():
@istest
+def table_style_can_be_found_by_id():
+ element = xml_element("w:styles", {}, [
+ _table_style_element("TableNormal", "Normal Table"),
+ ])
+ styles = read_styles_xml_element(element)
+ assert_equal(
+ "TableNormal",
+ styles.find_table_style_by_id("TableNormal").style_id
+ )
+
+
+@istest
def paragraph_and_character_styles_are_distinct():
element = xml_element("w:styles", {}, [
_paragraph_style_element("Heading1", "Heading 1"),
@@ -75,6 +87,9 @@ def _paragraph_style_element(style_id, name):
def _character_style_element(style_id, name):
return _style_element("character", style_id, name)
+def _table_style_element(style_id, name):
+ return _style_element("table", style_id, name)
+
def _style_element(element_type, style_id, name):
children = [xml_element("w:name", {"w:val": name}, [])]
return _style_element_with_children(element_type, style_id, children)