'''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 + '
\n'
for row in self.__matrix:
html += self.__indent_style * (self.__indent_level + 1) + '\n'
for cell in row:
html += self.__indent_style * (self.__indent_level + 2) + '\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) + ' | \n'
html += self.__indent_style * (self.__indent_level + 1) + '
\n'
return html + self.__indent_style * self.__indent_level + '
'
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, '%s' % text)
for row, week in enumerate(matrix):
for column, day in enumerate(week):
if day:
self.__table.mutate(row + 1, column, '%02d\n
\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, '%02d\n
\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()