diff HTML.py @ 0:c8c0131be526 draft

planemo upload commit 15239f1674081ab51ab8dd75a9a40cf1bfaa93e8
author cstrittmatter
date Mon, 20 Jan 2020 10:50:35 -0500 (2020-01-20)
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HTML.py	Mon Jan 20 10:50:35 2020 -0500
@@ -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()