diff options
| -rw-r--r-- | mammoth/conversion.py | 31 | ||||
| -rw-r--r-- | mammoth/document_matchers.py | 1 | ||||
| -rw-r--r-- | tests/conversion_tests.py | 27 |
3 files changed, 53 insertions, 6 deletions
diff --git a/mammoth/conversion.py b/mammoth/conversion.py index e3a6fe1..a4cf63b 100644 --- a/mammoth/conversion.py +++ b/mammoth/conversion.py @@ -39,7 +39,17 @@ class DocumentConverter(object): def _convert_run(self, run, html_generator): - self._convert_elements_to_html(run.children, html_generator) + run_generator = HtmlGenerator() + html_path = self._find_html_path_for_run(run) + if html_path: + satisfy_html_path(run_generator, html_path) + if run.is_bold: + run_generator.start("strong") + if run.is_italic: + run_generator.start("em") + self._convert_elements_to_html(run.children, run_generator) + run_generator.end_all() + html_generator.append(run_generator) def _convert_text(self, text, html_generator): @@ -52,14 +62,23 @@ class DocumentConverter(object): def _find_html_path_for_paragraph(self, paragraph): + default = html_paths.path([html_paths.element("p")]) + return self._find_html_path(paragraph, "paragraph", default) + + def _find_html_path_for_run(self, run): + return self._find_html_path(run, "run", default=None) + + + def _find_html_path(self, element, element_type, default): for style in self._styles: document_matcher = style.document_matcher - if document_matcher.element_type == "paragraph" and ( + if document_matcher.element_type == element_type and ( document_matcher.style_name is None or - document_matcher.style_name == paragraph.style_name): + document_matcher.style_name == element.style_name): return style.html_path - if paragraph.style_name is not None: - self.messages.append(results.warning("Unrecognised paragraph style: {0}".format(paragraph.style_name))) + if element.style_name is not None: + self.messages.append(results.warning("Unrecognised {0} style: {1}".format(element_type, element.style_name))) + + return default - return html_paths.path([html_paths.element("p")]) diff --git a/mammoth/document_matchers.py b/mammoth/document_matchers.py index e7cd12c..ed4171b 100644 --- a/mammoth/document_matchers.py +++ b/mammoth/document_matchers.py @@ -14,3 +14,4 @@ def run(style_name=None): RunMatcher = collections.namedtuple("RunMatcher", ["style_name"]) +RunMatcher.element_type = "run" diff --git a/tests/conversion_tests.py b/tests/conversion_tests.py index 647f58c..174e5b5 100644 --- a/tests/conversion_tests.py +++ b/tests/conversion_tests.py @@ -72,6 +72,33 @@ def no_warning_if_there_is_no_style_for_plain_paragraphs(): documents.paragraph(children=[_run_with_text("Tip")]), ) assert_equal([], result.messages) + + +@istest +def bold_runs_are_wrapped_in_strong_tags(): + result = convert_document_element_to_html( + documents.run(children=[documents.text("Hello")], is_bold=True), + ) + assert_equal("<strong>Hello</strong>", result.value) + + +@istest +def italic_runs_are_wrapped_in_emphasis_tags(): + result = convert_document_element_to_html( + documents.run(children=[documents.text("Hello")], is_italic=True), + ) + assert_equal("<em>Hello</em>", result.value) + + +@istest +def runs_are_converted_by_satisfying_matching_paths(): + result = convert_document_element_to_html( + documents.run(style_name="TipsRun", children=[documents.Text("Tip")]), + styles=[ + style_reader.read_style("r.TipsRun => span.tip") + ] + ) + assert_equal('<span class="tip">Tip</span>', result.value) def _run_with_text(text): |
