Mercurial > repos > iss > eurl_vtec_wgs_pt
diff HTML.py @ 0:c6bab5103a14 draft
"planemo upload commit 6abf3e299d82d07e6c3cf8642bdea80e96df64c3-dirty"
author | iss |
---|---|
date | Mon, 21 Mar 2022 15:23:09 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTML.py Mon Mar 21 15:23:09 2022 +0000 @@ -0,0 +1,361 @@ +#!/usr/bin/python +# -*- coding: iso-8859-1 -*- +""" +HTML.py - v0.04 2009-07-28 Philippe Lagadec + +This module provides a few classes to easily generate HTML code such as tables +and lists. + +Project website: http://www.decalage.info/python/html + +License: CeCILL (open-source GPL compatible), see source code for details. + http://www.cecill.info +""" + +__version__ = '0.04' +__date__ = '2009-07-28' +__author__ = 'Philippe Lagadec' + +#--- LICENSE ------------------------------------------------------------------ + +# Copyright Philippe Lagadec - see http://www.decalage.info/contact for contact info +# +# This module provides a few classes to easily generate HTML tables and lists. +# +# This software is governed by the CeCILL license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/or redistribute the software under the terms of the CeCILL +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://www.cecill.info". +# +# A copy of the CeCILL license is also provided in these attached files: +# Licence_CeCILL_V2-en.html and Licence_CeCILL_V2-fr.html +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL license and that you accept its terms. + +#--- THANKS -------------------------------------------------------------------- + +# - Michal Cernoevic, for the idea of column styles. + +#--- REFERENCES ---------------------------------------------------------------- + +# HTML 4.01 specs: http://www.w3.org/TR/html4/struct/tables.html + +# Colors: http://www.w3.org/TR/html4/types.html#type-color + +# Columns alignement and style, one of the oldest and trickiest bugs in Mozilla: +# https://bugzilla.mozilla.org/show_bug.cgi?id=915 + + +#--- CONSTANTS ----------------------------------------------------------------- + +# Table style to get thin black lines in Mozilla/Firefox instead of 3D borders +#TABLE_STYLE_THINBORDER = "border: 1px solid #000000; border-collapse: collapse;" +#TABLE_STYLE_THINBORDER = "border: 1px solid #000000;" + + +#=== CLASSES =================================================================== + +class TableCell (object): + """ + a TableCell object is used to create a cell in a HTML table. (TD or TH) + + Attributes: + - text: text in the cell (may contain HTML tags). May be any object which + can be converted to a string using str(). + - header: bool, false for a normal data cell (TD), true for a header cell (TH) + - bgcolor: str, background color + - width: str, width + - align: str, horizontal alignement (left, center, right, justify or char) + - char: str, alignment character, decimal point if not specified + - charoff: str, see HTML specs + - valign: str, vertical alignment (top|middle|bottom|baseline) + - style: str, CSS style + - attribs: dict, additional attributes for the TD/TH tag + + Reference: http://www.w3.org/TR/html4/struct/tables.html#h-11.2.6 + """ + + def __init__(self, text="", bgcolor=None, header=False, width=None, + align=None, char=None, charoff=None, valign=None, style=None, + attribs=None): + """TableCell constructor""" + self.text = text + self.bgcolor = bgcolor + self.header = header + self.width = width + self.align = align + self.char = char + self.charoff = charoff + self.valign = valign + self.style = style + self.attribs = attribs + if attribs==None: + self.attribs = {} + + def __str__(self): + """return the HTML code for the table cell as a string""" + attribs_str = "" + if self.bgcolor: self.attribs['bgcolor'] = self.bgcolor + if self.width: self.attribs['width'] = self.width + if self.align: self.attribs['align'] = self.align + if self.char: self.attribs['char'] = self.char + if self.charoff: self.attribs['charoff'] = self.charoff + if self.valign: self.attribs['valign'] = self.valign + if self.style: self.attribs['style'] = self.style + for attr in self.attribs: + attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) + if self.text: + text = str(self.text) + else: + # An empty cell should at least contain a non-breaking space + text = ' ' + if self.header: + return '<th%s>%s</th>' % (attribs_str, text) + else: + return '<td%s>%s</td>' % (attribs_str, text) + +#------------------------------------------------------------------------------- + +class TableRow (object): + """ + a TableRow object is used to create a row in a HTML table. (TR tag) + + Attributes: + - cells: list, tuple or any iterable, containing one string or TableCell + object for each cell + - header: bool, true for a header row (TH), false for a normal data row (TD) + - bgcolor: str, background color + - col_align, col_valign, col_char, col_charoff, col_styles: see Table class + - attribs: dict, additional attributes for the TR tag + + Reference: http://www.w3.org/TR/html4/struct/tables.html#h-11.2.5 + """ + + def __init__(self, cells=None, bgcolor=None, header=False, attribs=None, + col_align=None, col_valign=None, col_char=None, + col_charoff=None, col_styles=None): + """TableCell constructor""" + self.bgcolor = bgcolor + self.cells = cells + self.header = header + self.col_align = col_align + self.col_valign = col_valign + self.col_char = col_char + self.col_charoff = col_charoff + self.col_styles = col_styles + self.attribs = attribs + if attribs==None: + self.attribs = {} + + def __str__(self): + """return the HTML code for the table row as a string""" + attribs_str = "" + if self.bgcolor: self.attribs['bgcolor'] = self.bgcolor + for attr in self.attribs: + attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) + result = '<tr%s>' % attribs_str + for cell in self.cells: + col = self.cells.index(cell) # cell column index + if not isinstance(cell, TableCell): + cell = TableCell(cell, header=self.header) + # apply column alignment if specified: + if self.col_align and cell.align==None: + cell.align = self.col_align[col] + if self.col_char and cell.char==None: + cell.char = self.col_char[col] + if self.col_charoff and cell.charoff==None: + cell.charoff = self.col_charoff[col] + if self.col_valign and cell.valign==None: + cell.valign = self.col_valign[col] + # apply column style if specified: + if self.col_styles and cell.style==None: + cell.style = self.col_styles[col] + result += str(cell) + result += '</tr>\n' + return result + +#------------------------------------------------------------------------------- + +class Table (object): + """ + a Table object is used to create a HTML table. (TABLE tag) + + Attributes: + - rows: list, tuple or any iterable, containing one iterable or TableRow + object for each row + - header_row: list, tuple or any iterable, containing the header row (optional) + - border: str or int, border width + - style: str, table style in CSS syntax (thin black borders by default) + - width: str, width of the table on the page + - attribs: dict, additional attributes for the TABLE tag + - col_width: list or tuple defining width for each column + - col_align: list or tuple defining horizontal alignment for each column + - col_char: list or tuple defining alignment character for each column + - col_charoff: list or tuple defining charoff attribute for each column + - col_valign: list or tuple defining vertical alignment for each column + - col_styles: list or tuple of HTML styles for each column + + Reference: http://www.w3.org/TR/html4/struct/tables.html#h-11.2.1 + """ + + def __init__(self, rows=None, border='1', style=None, width=None, + cellspacing=None, cellpadding=4, attribs=None, header_row=None, + col_width=None, col_align=None, col_valign=None, + col_char=None, col_charoff=None, col_styles=None): + """TableCell constructor""" + self.border = border + self.style = style + # style for thin borders by default + #if style == None: self.style = TABLE_STYLE_THINBORDER + self.width = width + self.cellspacing = cellspacing + self.cellpadding = cellpadding + self.header_row = header_row + self.rows = rows + if not rows: self.rows = [] + self.attribs = attribs + if not attribs: self.attribs = {} + self.col_width = col_width + self.col_align = col_align + self.col_char = col_char + self.col_charoff = col_charoff + self.col_valign = col_valign + self.col_styles = col_styles + + def __str__(self): + """return the HTML code for the table as a string""" + attribs_str = "" + #if self.border: self.attribs['border'] = self.border + if self.style: self.attribs['style'] = self.style + if self.width: self.attribs['width'] = self.width + if self.cellspacing: self.attribs['cellspacing'] = self.cellspacing + if self.cellpadding: self.attribs['cellpadding'] = self.cellpadding + for attr in self.attribs: + attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) + result = '<table%s>\n' % attribs_str + # insert column tags and attributes if specified: + if self.col_width: + for width in self.col_width: + result += ' <col width="%s">\n' % width + # First insert a header row if specified: + if self.header_row: + if not isinstance(self.header_row, TableRow): + result += str(TableRow(self.header_row, header=True)) + else: + result += str(self.header_row) + # Then all data rows: + for row in self.rows: + if not isinstance(row, TableRow): + row = TableRow(row) + # apply column alignments and styles to each row if specified: + # (Mozilla bug workaround) + if self.col_align and not row.col_align: + row.col_align = self.col_align + if self.col_char and not row.col_char: + row.col_char = self.col_char + if self.col_charoff and not row.col_charoff: + row.col_charoff = self.col_charoff + if self.col_valign and not row.col_valign: + row.col_valign = self.col_valign + if self.col_styles and not row.col_styles: + row.col_styles = self.col_styles + result += str(row) + result += '</table>' + return result + + +#------------------------------------------------------------------------------- + +class List (object): + """ + a List object is used to create an ordered or unordered list in HTML. + (UL/OL tag) + + Attributes: + - lines: list, tuple or any iterable, containing one string for each line + - ordered: bool, choice between an ordered (OL) or unordered list (UL) + - attribs: dict, additional attributes for the OL/UL tag + + Reference: http://www.w3.org/TR/html4/struct/lists.html + """ + + def __init__(self, lines=None, ordered=False, start=None, attribs=None): + """List constructor""" + if lines: + self.lines = lines + else: + self.lines = [] + self.ordered = ordered + self.start = start + if attribs: + self.attribs = attribs + else: + self.attribs = {} + + def __str__(self): + """return the HTML code for the list as a string""" + attribs_str = "" + if self.start: self.attribs['start'] = self.start + for attr in self.attribs: + attribs_str += ' %s="%s"' % (attr, self.attribs[attr]) + if self.ordered: tag = 'ol' + else: tag = 'ul' + result = '<%s%s>\n' % (tag, attribs_str) + for line in self.lines: + result += ' <li>%s\n' % str(line) + result += '</%s>\n' % tag + return result + +#=== FUNCTIONS ================================================================ + +# much simpler definition of a link as a function: +def Link(text, url): + return '<a href="%s">%s</a>' % (url, text) + +def link(text, url): + return '<a href="%s">%s</a>' % (url, text) + +def table(*args, **kwargs): + 'return HTML code for a table as a string. See Table class for parameters.' + return str(Table(*args, **kwargs)) + +def list(*args, **kwargs): + 'return HTML code for a list as a string. See List class for parameters.' + return str(List(*args, **kwargs)) + + +#=== MAIN ===================================================================== + +# Show sample usage when this file is launched as a script. + +if __name__ == '__main__': + + # open an HTML file to show output in a browser + f = open('test.html', 'w') + + t = Table() + t.rows.append(TableRow(['A', 'B', 'C'], header=True)) + t.rows.append(TableRow(['D', 'E', 'F'])) + t.rows.append(('i', 'j', 'k')) + f.write(str(t) + '<p>\n') + print (str(t)) + f.close()