diff options
Diffstat (limited to 'mammoth')
| -rw-r--r-- | mammoth/conversion.py | 55 | ||||
| -rw-r--r-- | mammoth/document_matchers.py | 4 | ||||
| -rw-r--r-- | mammoth/html_generation.py | 18 | ||||
| -rw-r--r-- | mammoth/style_reader/document_matcher_reader.py | 6 |
4 files changed, 57 insertions, 26 deletions
diff --git a/mammoth/conversion.py b/mammoth/conversion.py index 1569849..fc35efe 100644 --- a/mammoth/conversion.py +++ b/mammoth/conversion.py @@ -6,7 +6,7 @@ import base64 import random from . import documents, results, html_paths, images, writers -from .html_generation import HtmlGenerator, satisfy_html_path +from .html_generation import HtmlGenerator, satisfy_html_path, append_html_path def convert_document_element_to_html(element, @@ -57,7 +57,7 @@ class DocumentConverter(object): documents.NoteReference: self._convert_note_reference, documents.Note: self._convert_note, } - self._convert_underline = convert_underline + self._convert_underline = convert_underline or self._default_convert_underline def convert_element_to_html(self, element, html_generator): @@ -97,12 +97,18 @@ class DocumentConverter(object): run_generator.start("sup") if run.vertical_alignment == documents.VerticalAlignment.subscript: run_generator.start("sub") - if run.is_underline and self._convert_underline is not None: + if run.is_underline: self._convert_underline(run_generator) self._convert_elements_to_html(run.children, run_generator) run_generator.end_all() html_generator.append(run_generator) - + + + def _default_convert_underline(self, run_generator): + style = self._find_style(None, "underline") + if style is not None: + append_html_path(run_generator, style.html_path) + def _convert_text(self, text, html_generator): html_generator.text(text.value) @@ -201,10 +207,9 @@ class DocumentConverter(object): def _find_html_path(self, element, element_type, default): - for style in self._style_map: - document_matcher = style.document_matcher - if _document_matcher_matches(document_matcher, element, element_type): - return style.html_path + style = self._find_style(element, element_type) + if style is not None: + return style.html_path if element.style_id is not None: self.messages.append(results.warning( @@ -213,7 +218,12 @@ class DocumentConverter(object): )) return default - + + def _find_style(self, element, element_type): + for style in self._style_map: + document_matcher = style.document_matcher + if _document_matcher_matches(document_matcher, element, element_type): + return style def _note_html_id(self, note): return self._html_id("{0}-{1}".format(note.note_type, note.note_id)) @@ -226,18 +236,21 @@ class DocumentConverter(object): def _document_matcher_matches(matcher, element, element_type): - return ( - matcher.element_type == element_type and ( - matcher.style_id is None or - matcher.style_id == element.style_id - ) and ( - matcher.style_name is None or - element.style_name is not None and (matcher.style_name.upper() == element.style_name.upper()) - ) and ( - element_type != "paragraph" or - matcher.numbering is None or - matcher.numbering == element.numbering + if matcher.element_type == "underline": + return element_type == "underline" + else: + return ( + matcher.element_type == element_type and ( + matcher.style_id is None or + matcher.style_id == element.style_id + ) and ( + matcher.style_name is None or + element.style_name is not None and (matcher.style_name.upper() == element.style_name.upper()) + ) and ( + element_type != "paragraph" or + matcher.numbering is None or + matcher.numbering == element.numbering + ) ) - ) _up_arrow = "↑" diff --git a/mammoth/document_matchers.py b/mammoth/document_matchers.py index 222ee73..07d5be2 100644 --- a/mammoth/document_matchers.py +++ b/mammoth/document_matchers.py @@ -15,3 +15,7 @@ def run(style_id=None, style_name=None): RunMatcher = collections.namedtuple("RunMatcher", ["style_id", "style_name"]) RunMatcher.element_type = "run" + + +class underline(object): + element_type = "underline" diff --git a/mammoth/html_generation.py b/mammoth/html_generation.py index c7f4f38..e538f6e 100644 --- a/mammoth/html_generation.py +++ b/mammoth/html_generation.py @@ -68,12 +68,22 @@ def satisfy_html_path(generator, path): generator.end() for element in path.elements[first_unsatisfied_index:]: - attributes = {} - if element.class_names: - attributes["class"] = _generate_class_attribute(element) - generator.start(element.names[0], attributes=attributes) + _append_element(generator, element) + + +def append_html_path(generator, path): + for element in path.elements: + _append_element(generator, element) + + +def _append_element(generator, element): + attributes = {} + if element.class_names: + attributes["class"] = _generate_class_attribute(element) + generator.start(element.names[0], attributes=attributes) + def _find_first_unsatisfied_index(generator, path): for index, (generated_element, path_element) in enumerate(zip(generator._stack, path.elements)): if not _is_element_match(generated_element, path_element): diff --git a/mammoth/style_reader/document_matcher_reader.py b/mammoth/style_reader/document_matcher_reader.py index 3dc9892..56c4626 100644 --- a/mammoth/style_reader/document_matcher_reader.py +++ b/mammoth/style_reader/document_matcher_reader.py @@ -14,6 +14,8 @@ def read_document_matcher_node(root_node): return _read_paragraph_node(element_node) elif element_node.expr_name == "run": return _read_run_node(element_node) + elif element_node.expr_name == "underline": + return document_matchers.underline def _read_paragraph_node(paragraph_node): @@ -53,7 +55,9 @@ def _read_list_node(list_node): return None grammar_text = r""" -document_matcher = paragraph / run +document_matcher = paragraph / run / underline + +underline = "u" paragraph = "p" style_id? style_name_specifier? list? |
