From bb0ff1066ea8f890f98092244d1b489ceab7c80e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 3 Aug 2025 07:58:40 +0100 Subject: Unify flow for storing styles --- mammoth/docx/styles_xml.py | 24 ++++++++++++++++-------- tests/docx/numbering_xml_tests.py | 4 +++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/mammoth/docx/styles_xml.py b/mammoth/docx/styles_xml.py index 937f852..0b3f39d 100644 --- a/mammoth/docx/styles_xml.py +++ b/mammoth/docx/styles_xml.py @@ -56,17 +56,19 @@ def read_styles_xml_element(element): "paragraph": paragraph_styles, "character": character_styles, "table": table_styles, + "numbering": numbering_styles, } for style_element in element.find_children("w:style"): - style = _read_style_element(style_element) element_type = style_element.attributes["w:type"] if element_type == "numbering": - numbering_styles[style.style_id] = _read_numbering_style_element(style_element) + style = _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 + style = _read_style_element(style_element) + + style_set = styles.get(element_type) + if style_set is not None: + style_set[style.style_id] = style return Styles( paragraph_styles=paragraph_styles, @@ -80,19 +82,25 @@ Style = collections.namedtuple("Style", ["style_id", "name"]) def _read_style_element(element): - style_id = element.attributes["w:styleId"] + style_id = _read_style_id(element) name = element.find_child_or_null("w:name").attributes.get("w:val") return Style(style_id=style_id, name=name) -NumberingStyle = collections.namedtuple("NumberingStyle", ["num_id"]) +NumberingStyle = collections.namedtuple("NumberingStyle", ["style_id", "num_id"]) def _read_numbering_style_element(element): + style_id = _read_style_id(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) + return NumberingStyle(style_id=style_id, num_id=num_id) + + +def _read_style_id(element): + return element.attributes["w:styleId"] diff --git a/tests/docx/numbering_xml_tests.py b/tests/docx/numbering_xml_tests.py index 1fb4c63..6f1e447 100644 --- a/tests/docx/numbering_xml_tests.py +++ b/tests/docx/numbering_xml_tests.py @@ -90,7 +90,9 @@ def test_when_abstract_num_has_num_style_link_then_style_is_used_to_find_num(): xml_element("w:abstractNumId", {"w:val": "101"}), ]) ]), - styles=Styles.create(numbering_styles={"List1": NumberingStyle(num_id="200")}), + styles=Styles.create(numbering_styles={ + "List1": NumberingStyle(style_id="List1", num_id="200"), + }), ) assert_equal(True, numbering.find_level("201", "0").is_ordered) -- cgit v1.2.3