From f5595b78f59d3f3a04c4e83702114dc2704f808a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 14 Dec 2013 17:25:23 +0000 Subject: Match document matchers with numbering correctly --- mammoth/conversion.py | 16 ++++++++++++--- mammoth/documents.py | 5 ++++- mammoth/docx/numbering_xml.py | 4 ++-- mammoth/style_reader/document_matcher_reader.py | 2 +- tests/conversion_tests.py | 26 +++++++++++++++++++++++++ tests/docx/document_xml_tests.py | 2 +- tests/style_reader_tests.py | 4 ++-- 7 files changed, 49 insertions(+), 10 deletions(-) diff --git a/mammoth/conversion.py b/mammoth/conversion.py index 3f30b22..87e1bf9 100644 --- a/mammoth/conversion.py +++ b/mammoth/conversion.py @@ -103,9 +103,7 @@ class DocumentConverter(object): def _find_html_path(self, element, element_type, default): for style in self._styles: document_matcher = style.document_matcher - if document_matcher.element_type == element_type and ( - document_matcher.style_name is None or - document_matcher.style_name == element.style_name): + if _document_matcher_matches(document_matcher, element, element_type): return style.html_path if element.style_name is not None: @@ -113,3 +111,15 @@ class DocumentConverter(object): return default + +def _document_matcher_matches(matcher, element, element_type): + return ( + matcher.element_type == element_type and ( + matcher.style_name is None or + matcher.style_name == element.style_name + ) and ( + element_type != "paragraph" or + matcher.numbering is None or + matcher.numbering == element.numbering + ) + ) diff --git a/mammoth/documents.py b/mammoth/documents.py index ba03e92..0f2d767 100644 --- a/mammoth/documents.py +++ b/mammoth/documents.py @@ -37,4 +37,7 @@ image = Image hyperlink = Hyperlink -NumberingLevel = collections.namedtuple("NumberingLevel", ["level_index", "is_ordered"]) +def numbering_level(level_index, is_ordered): + return _NumberingLevel(str(level_index), bool(is_ordered)) + +_NumberingLevel = collections.namedtuple("NumberingLevel", ["level_index", "is_ordered"]) diff --git a/mammoth/docx/numbering_xml.py b/mammoth/docx/numbering_xml.py index 115d812..ebac1c8 100644 --- a/mammoth/docx/numbering_xml.py +++ b/mammoth/docx/numbering_xml.py @@ -1,4 +1,4 @@ -from ..documents import NumberingLevel +from ..documents import numbering_level def read_numbering_xml_element(element): @@ -30,7 +30,7 @@ def _read_abstract_num_level(element): level_index = element.attributes["w:ilvl"] num_fmt = element.find_child_or_null("w:numFmt").attributes.get("w:val") is_ordered = num_fmt != "bullet" - return NumberingLevel(level_index, is_ordered) + return numbering_level(level_index, is_ordered) def _read_nums(element, abstract_nums): diff --git a/mammoth/style_reader/document_matcher_reader.py b/mammoth/style_reader/document_matcher_reader.py index fba6092..4bc7247 100644 --- a/mammoth/style_reader/document_matcher_reader.py +++ b/mammoth/style_reader/document_matcher_reader.py @@ -36,7 +36,7 @@ def _read_style_node(style_node): def _read_list_node(list_node): if list_node.children: - return documents.NumberingLevel( + return documents.numbering_level( int(list_node.children[0].children[3].text), is_ordered=list_node.children[0].children[1].text == "ordered-list", ) diff --git a/tests/conversion_tests.py b/tests/conversion_tests.py index 4732991..c0fab30 100644 --- a/tests/conversion_tests.py +++ b/tests/conversion_tests.py @@ -74,6 +74,32 @@ def no_warning_if_there_is_no_style_for_plain_paragraphs(): documents.paragraph(children=[_run_with_text("Tip")]), ) assert_equal([], result.messages) + + +@istest +def bulleted_paragraphs_are_converted_using_matching_styles(): + result = convert_document_element_to_html( + documents.paragraph(children=[ + _run_with_text("Hello") + ], numbering=documents.numbering_level(level_index=1, is_ordered=False)), + styles=[ + style_reader.read_style("p:unordered-list(1) => ul > li:fresh") + ] + ) + assert_equal('', result.value) + + +@istest +def bulleted_styles_dont_match_plain_paragraph(): + result = convert_document_element_to_html( + documents.paragraph(children=[ + _run_with_text("Hello") + ]), + styles=[ + style_reader.read_style("p:unordered-list(1) => ul > li:fresh") + ] + ) + assert_equal('

Hello

', result.value) @istest diff --git a/tests/docx/document_xml_tests.py b/tests/docx/document_xml_tests.py index e6e8c88..75b0e20 100644 --- a/tests/docx/document_xml_tests.py +++ b/tests/docx/document_xml_tests.py @@ -68,7 +68,7 @@ class ReadXmlElementTests(object): properties_xml = xml_element("w:pPr", {}, [numbering_properties_xml]) paragraph_xml = xml_element("w:p", {}, [properties_xml]) - numbering = Numbering({"42": {"1": documents.NumberingLevel("1", True)}}) + numbering = Numbering({"42": {"1": documents.numbering_level("1", True)}}) paragraph = _read_and_get_document_xml_element(paragraph_xml, numbering=numbering) assert_equal("1", paragraph.numbering.level_index) diff --git a/tests/style_reader_tests.py b/tests/style_reader_tests.py index 2f852e5..0d266d6 100644 --- a/tests/style_reader_tests.py +++ b/tests/style_reader_tests.py @@ -82,7 +82,7 @@ class ReadDocumentMatcherTests(object): @istest def reads_paragraph_ordered_list(self): assert_equal( - document_matchers.paragraph(numbering=documents.NumberingLevel(2, is_ordered=True)), + document_matchers.paragraph(numbering=documents.numbering_level(2, is_ordered=True)), read_document_matcher("p:ordered-list(2)") ) @@ -90,7 +90,7 @@ class ReadDocumentMatcherTests(object): @istest def reads_paragraph_unordered_list(self): assert_equal( - document_matchers.paragraph(numbering=documents.NumberingLevel(2, is_ordered=False)), + document_matchers.paragraph(numbering=documents.numbering_level(2, is_ordered=False)), read_document_matcher("p:unordered-list(2)") ) -- cgit v1.2.3