from . import documents, results, html_paths from .html_generation import HtmlGenerator, satisfy_html_path def convert_document_element_to_html(element, styles=None): if styles is None: styles = [] html_generator = HtmlGenerator() converter = DocumentConverter(styles) converter.convert_element_to_html(element, html_generator) html_generator.end_all() return results.success(html_generator.html_string()) class DocumentConverter(object): def __init__(self, styles): self._styles = styles self._converters = { documents.Document: self._convert_document, documents.Paragraph: self._convert_paragraph, documents.Run: self._convert_run, documents.Text: self._convert_text, } def convert_element_to_html(self, element, html_generator): self._converters[type(element)](element, html_generator) def _convert_document(self, document, html_generator): self._convert_elements_to_html(document.children, html_generator) def _convert_paragraph(self, paragraph, html_generator): html_path = self._find_html_path_for_paragraph(paragraph) satisfy_html_path(html_generator, html_path) self._convert_elements_to_html(paragraph.children, html_generator) def _convert_run(self, run, html_generator): self._convert_elements_to_html(run.children, html_generator) def _convert_text(self, text, html_generator): html_generator.text(text.value) def _convert_elements_to_html(self, elements, html_generator): for element in elements: self.convert_element_to_html(element, html_generator) def _find_html_path_for_paragraph(self, paragraph): for style in self._styles: document_matcher = style.document_matcher if document_matcher.element_type == "paragraph" and ( document_matcher.style_name is None or document_matcher.style_name == paragraph.style_name): return style.html_path return html_paths.path([html_paths.element("p")])