This recipe requires the z_matrix module. Two classes are provided, HTML_Table and HTML_Month. HTML_Table can manage the generation of a table in HTML format. HTML_Month builds on top of HTML_Table and expands on its capabilities. It allows for dynamically created tables that have the look of the selected month.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127  | '''Support module for CGI applications.
This modules provides access to the HTML_Table and HTML_Month
classes which provide abstractions to the HTML code involved.'''
__version__ = 1.1
################################################################################
import calendar
import z_matrix
class HTML_Table:
    'HTML_Table(rows, columns, indent_level, indent_style) -> new HTML_Table'
    def __init__(self, rows, columns, indent_level, indent_style):
        'x.__init__(...) initializes x'
        self.__matrix = z_matrix.Matrix(rows, columns, '')
        self.__indent_level = indent_level
        self.__indent_style = indent_style
        self.__table_attributes = ''
        self.__row_attributes = ''
        self.__cell_attributes = ''
    def mutate(self, row, column, text):
        'Mutates a cell in the HTML table.'
        assert type(text) is str
        self.__matrix[row][column] = text
        return self
    def access(self, row, column):
        'Accesses a cell in the HTML table.'
        return self.__matrix[row][column]
    def set_table(self, *attributes):
        'Sets the attributes for the table.'
        self.__table_attributes = self.__parse(attributes)
        return self
    def set_row(self, *attributes):
        'Sets the attributes for each row.'
        self.__row_attributes = self.__parse(attributes)
        return self
    def set_cell(self, *attributes):
        'Sets the attributes for each cell.'
        self.__cell_attributes = self.__parse(attributes)
        return self
    def __parse(self, attributes):
        'Parses the attributes into a string.'
        return ''.join([' %s="%s"' % (parameter, value) for parameter, value in attributes])
    def html(self):
        'Returns the HTML code for the current table.'
        html = self.__indent_style * self.__indent_level + '<table' + self.__table_attributes + '>\n'
        for row in self.__matrix:
            html += self.__indent_style * (self.__indent_level + 1) + '<tr' + self.__row_attributes + '>\n'
            for cell in row:
                html += self.__indent_style * (self.__indent_level + 2) + '<td' + self.__cell_attributes + '>\n'
                html += ''.join([self.__indent_style * (self.__indent_level  + 3) + line + '\n' for line in cell.splitlines()])
                html += self.__indent_style * (self.__indent_level + 2) + '</td>\n'
            html += self.__indent_style * (self.__indent_level + 1) + '</tr>\n'
        return html + self.__indent_style * self.__indent_level + '</table>'
class HTML_Month:
    'HTML_Month(month, year, indent_level, indent_style) -> new HTML_Month'
    def __init__(self, month, year, indent_level, indent_style):
        'x.__init__(...) initializes x'
        calendar.setfirstweekday(calendar.SUNDAY)
        matrix = calendar.monthcalendar(year, month)
        self.__table = HTML_Table(len(matrix) + 1, 7, indent_level, indent_style)
        for column, text in enumerate(calendar.day_name[-1:] + calendar.day_name[:-1]):
            self.__table.mutate(0, column, '<b>%s</b>' % text)
        for row, week in enumerate(matrix):
            for column, day in enumerate(week):
                if day:
                    self.__table.mutate(row + 1, column, '<b>%02d</b>\n<hr>\n' % day)
        self.__weekday, self.__alldays = calendar.monthrange(year, month)
        self.__weekday = ((self.__weekday + 1) % 7) + 6
    def mutate(self, day, text):
        'Mutates a day in the HTML month.'
        row, column = self.__row_column(day)
        self.__table.mutate(row, column, '<b>%02d</b>\n<hr>\n%s' % (day, text))
        return self
    def access(self, day):
        'Accesses a day in the HTML month.'
        row, column = self.__row_column(day)
        return self.__table.access(row, column)[15:]
    def __row_column(self, day):
        'Calculates the row and column of day.'
        assert 1 <= day <= self.__alldays
        index = day + self.__weekday
        return index / 7, index % 7
    def set_month(self, *attributes):
        'Set the attributes for the month.'
        self.__table.set_table(*attributes)
        return self
    def set_week(self, *attributes):
        'Set the attributes for each week.'
        self.__table.set_row(*attributes)
        return self
    def set_day(self, *attributes):
        'Set the attributes for each day.'
        self.__table.set_cell(*attributes)
        return self
    def html(self):
        'Returns the HTML code for the current month.'
        return self.__table.html()
################################################################################
if __name__ == '__main__':
    import sys
    print 'Content-Type: text/plain'
    print
    print file(sys.argv[0]).read()
 | 
Version 1.0 of this module was used to create a CGI application that could create a work schedule for an individual. It was far better than coding the schedule by hand. For those who do not like the formatting done by classes, modification of the code may be in order. Otherwise, this recipe was be used as a guide to writting classes designed to emulate part of the DOM that is associated with a web page.
Download
Copy to clipboard