1# -*- coding: utf-8 -*-
2
3"""
4/***************************************************************************
5Name                 : DB Manager
6Description          : Database manager plugin for QGIS
7Date                 : May 23, 2011
8copyright            : (C) 2011 by Giuseppe Sucameli
9email                : brush.tyler@gmail.com
10
11 ***************************************************************************/
12
13/***************************************************************************
14 *                                                                         *
15 *   This program is free software; you can redistribute it and/or modify  *
16 *   it under the terms of the GNU General Public License as published by  *
17 *   the Free Software Foundation; either version 2 of the License, or     *
18 *   (at your option) any later version.                                   *
19 *                                                                         *
20 ***************************************************************************/
21"""
22from builtins import str
23from builtins import object
24
25
26class HtmlContent(object):
27
28    def __init__(self, data):
29        self.data = data if not isinstance(data, HtmlContent) else data.data
30
31    def toHtml(self):
32        if isinstance(self.data, list) or isinstance(self.data, tuple):
33            html = u''
34            for item in self.data:
35                html += HtmlContent(item).toHtml()
36            return html
37
38        if hasattr(self.data, 'toHtml'):
39            return self.data.toHtml()
40
41        html = str(self.data).replace("\n", "<br>")
42        return html
43
44    def hasContents(self):
45        if isinstance(self.data, list) or isinstance(self.data, tuple):
46            empty = True
47            for item in self.data:
48                if item.hasContents():
49                    empty = False
50                    break
51            return not empty
52
53        if hasattr(self.data, 'hasContents'):
54            return self.data.hasContents()
55
56        return len(self.data) > 0
57
58
59class HtmlElem(object):
60
61    def __init__(self, tag, data, attrs=None):
62        self.tag = tag
63        self.data = data if isinstance(data, HtmlContent) else HtmlContent(data)
64        self.attrs = attrs if attrs is not None else dict()
65        if 'tag' in self.attrs:
66            self.setTag(self.attrs['tag'])
67            del self.attrs['tag']
68
69    def setTag(self, tag):
70        self.tag = tag
71
72    def getOriginalData(self):
73        return self.data.data
74
75    def setAttr(self, name, value):
76        self.attrs[name] = value
77
78    def getAttrsHtml(self):
79        html = u''
80        for k, v in self.attrs.items():
81            html += u' %s="%s"' % (k, v)
82        return html
83
84    def openTagHtml(self):
85        return u"<%s%s>" % (self.tag, self.getAttrsHtml())
86
87    def closeTagHtml(self):
88        return u"</%s>" % self.tag
89
90    def toHtml(self):
91        return u"%s%s%s" % (self.openTagHtml(), self.data.toHtml(), self.closeTagHtml())
92
93    def hasContents(self):
94        return self.data.toHtml() != ""
95
96
97class HtmlParagraph(HtmlElem):
98
99    def __init__(self, data, attrs=None):
100        HtmlElem.__init__(self, 'p', data, attrs)
101
102
103class HtmlListItem(HtmlElem):
104
105    def __init__(self, data, attrs=None):
106        HtmlElem.__init__(self, 'li', data, attrs)
107
108
109class HtmlList(HtmlElem):
110
111    def __init__(self, items, attrs=None):
112        # make sure to have HtmlListItem items
113        items = list(items)
114        for i, item in enumerate(items):
115            if not isinstance(item, HtmlListItem):
116                items[i] = HtmlListItem(item)
117        HtmlElem.__init__(self, 'ul', items, attrs)
118
119
120class HtmlTableCol(HtmlElem):
121
122    def __init__(self, data, attrs=None):
123        HtmlElem.__init__(self, 'td', data, attrs)
124
125    def closeTagHtml(self):
126        # FIX INVALID BEHAVIOR: an empty cell as last table's cell break margins
127        return u"&nbsp;%s" % HtmlElem.closeTagHtml(self)
128
129
130class HtmlTableRow(HtmlElem):
131
132    def __init__(self, cols, attrs=None):
133        # make sure to have HtmlTableCol items
134        cols = list(cols)
135        for i, c in enumerate(cols):
136            if not isinstance(c, HtmlTableCol):
137                cols[i] = HtmlTableCol(c)
138        HtmlElem.__init__(self, 'tr', cols, attrs)
139
140
141class HtmlTableHeader(HtmlTableRow):
142
143    def __init__(self, cols, attrs=None):
144        HtmlTableRow.__init__(self, cols, attrs)
145        for c in self.getOriginalData():
146            c.setTag('th')
147
148
149class HtmlTable(HtmlElem):
150
151    def __init__(self, rows, attrs=None):
152        # make sure to have HtmlTableRow items
153        rows = list(rows)
154        for i, r in enumerate(rows):
155            if not isinstance(r, HtmlTableRow):
156                rows[i] = HtmlTableRow(r)
157        HtmlElem.__init__(self, 'table', rows, attrs)
158
159
160class HtmlWarning(HtmlContent):
161
162    def __init__(self, data):
163        data = ['<img src=":/icons/warning-20px.png">&nbsp;&nbsp; ', data]
164        HtmlContent.__init__(self, data)
165
166
167class HtmlSection(HtmlContent):
168
169    def __init__(self, title, content=None):
170        data = ['<div class="section"><h2>', title, '</h2>']
171        if content is not None:
172            data.extend(['<div>', content, '</div>'])
173        data.append('</div>')
174        HtmlContent.__init__(self, data)
175