aboutsummaryrefslogtreecommitdiff
path: root/mammoth/conversion.py
blob: e3a6fe17e982c5b9985b4db7e9741da8b8138178 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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.Result(html_generator.html_string(), converter.messages)


class DocumentConverter(object):
    def __init__(self, styles):
        self.messages = []
        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
        
        if paragraph.style_name is not None:
            self.messages.append(results.warning("Unrecognised paragraph style: {0}".format(paragraph.style_name)))
        
        return html_paths.path([html_paths.element("p")])