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" %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"> ', 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