aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-12-14 16:36:27 +0000
committerMichael Williamson <mike@zwobble.org>2013-12-14 16:36:27 +0000
commit996491337023abe6033c3caf76dfa4501bd27ce3 (patch)
tree5d3c4bac5e7e47451e5aef0ac4d8a53b9927522b
parentf1791fd544d01c118951fdca96b63a151d808941 (diff)
Generate styles for runs
-rw-r--r--mammoth/conversion.py31
-rw-r--r--mammoth/document_matchers.py1
-rw-r--r--tests/conversion_tests.py27
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):