Completed
Pull Request — master (#22)
by Oleg
01:36
created

write_into_file()   A

Complexity

Conditions 2

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 2
dl 0
loc 18
rs 9.4285
1
"""
2
SDoc
3
4
Copyright 2016 Set Based IT Consultancy
5
6
Licence MIT
7
"""
8
# ----------------------------------------------------------------------------------------------------------------------
9
from sdoc.helper.Html import Html
10
from sdoc.sdoc2 import node_store
11
from sdoc.sdoc2.formatter.html.HtmlFormatter import HtmlFormatter
12
13
14
class TableHtmlFormatter(HtmlFormatter):
15
    """
16
    HtmlFormatter for generating HTML code for table.
17
    """
18
    # ------------------------------------------------------------------------------------------------------------------
19
    def generate(self, node, file):
20
        """
21
        Generates the HTML code for a table node.
22
23
        :param sdoc.sdoc2.node.TableNode.TableNode node: The table node.
24
        :param file file: The output file.
25
        """
26
        self.write_into_file(node, file)
27
28
    # ------------------------------------------------------------------------------------------------------------------
29
    def generate_chapter(self, node, file):
30
        """
31
        Generates the HTML code for a table node.
32
33
        :param sdoc.sdoc2.node.TableNode.TableNode node: The table node.
34
        :param file file: The output file.
35
        """
36
        if file:
37
            self.write_into_file(node, file)
38
39
    # ------------------------------------------------------------------------------------------------------------------
40
    def write_into_file(self, node, file):
41
        """
42
        Writes data into opened file.
43
44
        :param sdoc.sdoc2.node.TableNode.TableNode node: The table node.
45
        :param file file: The output file.
46
        """
47
        # Attributes for table.
48
        table_attrs = {'class': node.get_option_value('class')}
49
50
        if node.column_headers:
51
            rows = self.generate_table_with_header(node)
52
        else:
53
            rows = self.generate_table(node)
54
55
        html_table = Html.generate_element('table', table_attrs, rows, True)
56
57
        file.write(html_table)
58
59
    # ------------------------------------------------------------------------------------------------------------------
60
    @staticmethod
61
    def generate_table(node):
62
        """
63
        Generates table without header.
64
65
        :param sdoc.sdoc2.node.TableNode.TableNode node: The table node.
66
67
        :rtype: str
68
        """
69
        columns = ''
70
        rows = ''
71
72
        for row in node.rows:
73
            for column in row:
74
                columns += Html.generate_element('td', {}, column)
75
            rows += Html.generate_element('tr', {}, columns, True)
76
            columns = ''
77
78
        return rows
79
80
    # ------------------------------------------------------------------------------------------------------------------
81
    @staticmethod
82
    def generate_table_with_header(node):
83
        """
84
        Generates table with header.
85
86
        :param sdoc.sdoc2.node.TableNode.TableNode node: The table node.
87
88
        :rtype: str
89
        """
90
        table_header = ''
91
        columns = ''
92
        rows = ''
93
94
        for column in node.column_headers:
95
            table_header += Html.generate_element('th', {}, column, True)
96
        table_header = Html.generate_element('tr', {}, table_header, True)
97
98
        header_column_counter = 0
99
        for row in node.rows:
100
            for col in row:
101
                align = TableHtmlFormatter.get_align(node.alignments, header_column_counter)
102
                columns += Html.generate_element('td', {'style': "text-align: {0}".format(align)}, col)
103
                header_column_counter += 1
104
            rows += Html.generate_element('tr', {}, columns, True)
105
            columns = ''
106
            header_column_counter = 0
107
108
        return table_header + rows
109
110
    # ------------------------------------------------------------------------------------------------------------------
111
    @staticmethod
112
    def get_align(align_list, column):
113
        """
114
        Returns the align or None.
115
116
        :param list[str|None] align_list: The list with alignments.
117
        :param int column: The number of column.
118
119
        :rtype: list[str|None] | None
120
        """
121
        try:
122
            return align_list[column]
123
        except IndexError:
124
            return None
125
126
127
# ----------------------------------------------------------------------------------------------------------------------
128
node_store.register_formatter('table', 'html', TableHtmlFormatter)
129