Passed
Push — master ( 97f4cf...78acb5 )
by Matěj
06:08 queued 12s
created

BuilderHtmlGraph._get_html()   A

Complexity

Conditions 1

Size

Total Lines 17
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 16
nop 2
dl 0
loc 17
ccs 5
cts 5
cp 1
crap 1
rs 9.6
c 0
b 0
f 0
1 1
import os
2 1
import json
3 1
import re
4 1
import sys
5 1
from lxml import etree
6 1
from lxml.builder import ElementMaker, E
7 1
import lxml.html
8
9
10 1
class BuilderHtmlGraph():
11 1
    def __init__(self, parts, verbose):
12 1
        self.parts = parts
13 1
        self.verbose = verbose
14
15 1
    def save_html(self, dict_oval_trees, src, rules):
16 1
        self.save_html_report(dict_oval_trees, src)
17 1
        self.print_output_message(src, self._format_rules_output(rules))
18
19 1
    def save_html_report(self, dict_of_rules, src):
20 1
        with open(src, "w+") as data_file:
21 1
            data_file.writelines(self._get_html(dict_of_rules))
22
23 1
    def _get_html(self, dict_of_rules):
24 1
        maker = ElementMaker(namespace=None,
25
                             nsmap={None: "http://www.w3.org/1999/xhtml"})
26 1
        html = maker.html(
27
            self._get_html_head(),
28
            self._get_html_body(dict_of_rules))
29 1
        result = etree.tostring(
30
            html,
31
            xml_declaration=True,
32
            doctype=('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"'
33
                     ' "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'),
34
            encoding='utf-8',
35
            standalone=False,
36
            with_tail=False,
37
            method='html',
38
            pretty_print=True)
39 1
        return result.decode('UTF-8')
40
41 1
    def _get_html_head(self):
42 1
        return E.head(
43
            E.title("OVAL TREE"),
44
            E.style(self._get_part('css.txt')),
45
            E.style(self._get_part('bootstrapStyle.txt')),
46
            E.style(self._get_part('jsTreeStyle.txt')),
47
            E.script(self._get_part('jQueryScript.txt')),
48
            E.script(self._get_part('bootstrapScript.txt')),
49
            E.script(self._get_part('jsTreeScript.txt')),
50
        )
51
52 1
    def _get_html_body(self, dict_of_rules):
53 1
        return E.body(
54
            E.script(self._get_script_graph_data(dict_of_rules)),
55
            self._get_titles_and_places_for_graph(dict_of_rules),
56
            E.div({'id': 'data'}),
57
            E.div({'id': 'modal', 'class': 'modal'},
58
                  E.div({'class': 'modal-content'},
59
                        E.span({'id': 'close', 'class': 'close'}, '×'),
60
                        E.div({'id': 'content'}),
61
                        )
62
                  ),
63
            E.script(self._get_part('script.js')),
64
        )
65
66 1
    def _get_script_graph_data(self, dict_of_rules):
67 1
        json_of_graphs = {
68
            re.sub(
69
                r'[\_\-\.]',
70
                '',
71
                k): v for k,
72
            v in dict_of_rules.items()}
73 1
        return ("var data_of_tree = " +
74
                str(json.dumps(json_of_graphs, sort_keys=False, indent=4)) +
75
                ";")
76
77 1
    def _get_titles_and_places_for_graph(self, dict_of_rules):
78 1
        out = ''
79 1
        for rule in dict_of_rules.keys():
80 1
            out += ('<h1>' +
81
                    rule +
82
                    '</h1><div id="' +
83
                    re.sub(r'[\_\-\.]', '', rule) +
84
                    '"></div>')
85 1
        return lxml.html.fromstring(out)
86
87 1
    def _get_part(self, part):
88 1
        out = ''
89 1
        with open(os.path.join(self.parts, part), "r") as data_file:
90 1
            for line in data_file.readlines():
91 1
                out += line
92 1
        return out
93
94 1
    def print_output_message(self, src, rule):
95 1
        if self.verbose:
96 1
            print('Rule(s) "{}" done!'.format(rule), file=sys.stderr)
97
98 1
    def _format_rules_output(self, rules):
99 1
        out = ''
100 1
        for rule in rules['rules']:
101 1
            out += rule + '\n'
102
        return out
103