aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mammoth/conversion.py16
-rw-r--r--mammoth/documents.py5
-rw-r--r--mammoth/docx/numbering_xml.py4
-rw-r--r--mammoth/style_reader/document_matcher_reader.py2
-rw-r--r--tests/conversion_tests.py26
-rw-r--r--tests/docx/document_xml_tests.py2
-rw-r--r--tests/style_reader_tests.py4
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('<ul><li>Hello</li></ul>', 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('<p>Hello</p>', 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)")
)