#=============================================================================== # Calendar Maker.pyw #=============================================================================== import CGIHTTPServer import socket import sys import thread import webbrowser def main(): try: socket.socket().connect(('127.0.0.1', 80)) webbrowser.open('http://127.0.0.1/htbin/index.py') except: if len(sys.argv) > 1: sys.argv[1] = '80' else: sys.argv.append('80') thread.start_new_thread(CGIHTTPServer.test, ()) webbrowser.open('http://127.0.0.1/htbin/index.py') s = socket.socket() s.bind(('', 8080)) s.listen(1) s.accept() if __name__ == '__main__': main() #=============================================================================== # htbin\__init__.py #=============================================================================== #=============================================================================== # htbin\index.py #=============================================================================== import cgitb; cgitb.enable() from xml_stream import * import xml.sax.xmlreader import xml.sax.saxutils import StringIO import getpass import z_html import z_cgi import sys import os ################################################################################ FIRST_FORM = '''\ Calendar Maker
%s
Month:
Year:

File:

Shutdown
''' ################################################################################ SECOND_FORM = '''\ %s
%s %s
''' ################################################################################ THIRD_FORM = '''\ %s %s ''' ################################################################################ def main(): if z_cgi.dictionary.has_key('select'): try: show_month() except Exception, error: if isinstance(error, SystemExit): raise show_first('\n

ERROR

') elif z_cgi.dictionary.has_key('month'): show_print() else: show_first() def show_first(error=''): z_cgi.print_html(FIRST_FORM % (error, os.path.basename(sys.argv[0]))) def show_month(): # region V2 try: error = True try: month = int(z_cgi.dictionary['month']) error = False except: m = z_cgi.dictionary['month'].lower() for month, name in enumerate(z_html.calendar.month_name): if name.lower().startswith(m): error = False break assert not error year = int(z_cgi.dictionary['year']) create_month_form(year, month) except Exception, error: if isinstance(error, SystemExit): raise assert z_cgi.dictionary['select'] == 'Load' create_month_form() # endregion # region V2 class MonthParser: def __init__(self): self.days = {} self.__month = False self.__year = False self.__textarea = None def __getattr__(self, name): return Event def startElement(self, name, attrs): if name == 'Month': self.__month = True elif name == 'Year': self.__year = True elif name == 'TextArea': self.__textarea = attrs.getValue('day') def characters(self, content): if self.__month: self.__month = False self.month = int(content) elif self.__year: self.__year = False self.year = int(content) elif self.__textarea is not None: self.days[int(self.__textarea)] = str(content) self.__textarea = None # endregion def create_month_form(year=None, month=None): # region V2 if z_cgi.dictionary['select'] == 'Load': load = True filename = os.path.join('C:\\Documents and Settings\\%s\\Desktop' % getpass.getuser(), z_cgi.dictionary['filename']) s = Stream(filename) s.minimize() parser = MonthParser() s.parse(parser) year = parser.year month = parser.month else: load = False # endregion m_a_y = '%s %s' % (z_html.calendar.month_name[month], year) h_month = z_html.HTML_Month(month, year, 0, ' ') h_month.set_month(height='100%', width='100%', border=1) h_month.set_week(valign='top') h_month.set_day(width='14%') for x in range(z_html.calendar.monthrange(year, month)[1]): # region V2 if load: try: h_month.mutate(x + 1, '' % (x, parser.days[x])) h_month.special(x + 1, True) except: h_month.mutate(x + 1, '' % x) else: h_month.mutate(x + 1, '' % x) # endregion h_table = z_html.HTML_Table(1, 1, 3, ' ') if load: h_table.special(0, 0, True) h_table.mutate(0, 0, '%s\n%s' % (m_a_y, h_month.html())) h_table.set_table(width='100%', height='100%') # region V2 controls = z_html.HTML_Table(2, 3, 3, ' ') controls.mutate(0, 0, 'HTML:') controls.mutate(0, 1, '' % m_a_y) controls.mutate(0, 2, '') controls.mutate(1, 0, 'XML:') controls.mutate(1, 1, '' % m_a_y) controls.mutate(1, 2, '') # endregion data = SECOND_FORM % (m_a_y, os.path.basename(sys.argv[0]), month, year, h_table.html(), controls.html()) z_cgi.print_html(data) def show_print(): month = int(z_cgi.dictionary['month']) year = int(z_cgi.dictionary['year']) create_print(month, year) def create_print(month, year): # region V2 if z_cgi.dictionary['action'] == 'Save': save = True stream = [startDocument(), startElement('Calendar', xml.sax.xmlreader.AttributesImpl({})), startElement('Date', xml.sax.xmlreader.AttributesImpl({})), startElement('Month', xml.sax.xmlreader.AttributesImpl({})), characters(str(month)), endElement('Month'), startElement('Year', xml.sax.xmlreader.AttributesImpl({})), characters(str(year)), endElement('Year'), endElement('Date'), startElement('Days', xml.sax.xmlreader.AttributesImpl({}))] else: save = False # endregion m_a_y = '%s %s' % (z_html.calendar.month_name[month], year) h_month = z_html.HTML_Month(month, year, 0, ' ') h_month.set_month(height='100%', width='100%', border=1) h_month.set_week(valign='top') h_month.set_day(width='14%') for x in range(z_html.calendar.monthrange(year, month)[1]): h_month.mutate(x + 1, '
'.join(z_cgi.dictionary['ta%s' % x].splitlines())) # region V2 if save and z_cgi.dictionary['ta%s' % x]: stream.extend([startElement('TextArea', xml.sax.xmlreader.AttributesImpl({'day': str(x)})), characters(z_cgi.dictionary['ta%s' % x]), endElement('TextArea')]) # endregion h_table = z_html.HTML_Table(1, 1, 2, ' ') h_table.mutate(0, 0, '%s\n%s' % (m_a_y, h_month.html())) h_table.set_table(width='100%', height='100%') # region V2 name = 'C:\\Documents and Settings\\%s\\Desktop' % getpass.getuser() if save: stream.extend([endElement('Days'), endElement('Calendar'), endDocument()]) data = StringIO.StringIO() xml_gen = xml.sax.saxutils.XMLGenerator(data) for event in stream: event(xml_gen) stream = Stream(data.getvalue()) stream.maximize(' ') stream.parse(xml.sax.saxutils.XMLGenerator(file(os.path.join(name, z_cgi.dictionary['xml']), 'w'))) # endregion data = THIRD_FORM % (m_a_y, h_table.html()) # region V2 if z_cgi.dictionary['action'] == 'Create': file(os.path.join(name, z_cgi.dictionary['filename']), 'w').write(data) # endregion z_cgi.print_html(data) if __name__ == '__main__': z_cgi.execute(main, 'code') #=============================================================================== # htbin\xml_stream.py #=============================================================================== '''Module for XML event streams. This module provides several classes for creating, saving, and delaying the processing of XML events.''' __version__ = '1.0' import os as _os import sys as _sys import xml.sax as _xml_sax ################################################################################ class Event: 'Event(*args) -> Event' def __init__(self, *args): 'Initialize the Event object.' self.__args = args def __repr__(self): 'Return the object\'s representation.' return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr, self.__args))) def __call__(self, handler=None): 'Either return arguments or process handler.' if handler is None: return self.__args else: getattr(handler, self.__class__.__name__)(*self.__args) class setDocumentLocator(Event): pass class startDocument(Event): pass class endDocument(Event): pass class startPrefixMapping(Event): pass class endPrefixMapping(Event): pass class startElement(Event): pass class endElement(Event): pass class startElementNS(Event): pass class endElementNS(Event): pass class characters(Event): pass class ignorableWhitespace(Event): pass class processingInstruction(Event): pass class skippedEntity(Event): pass ################################################################################ class Stream: 'Stream(filename_or_stream_or_string) -> Stream' def __init__(self, filename_or_stream_or_string): 'Initialize the Stream object.' self.__stream = [] if isinstance(filename_or_stream_or_string, str): if _os.path.exists(filename_or_stream_or_string): _xml_sax.parse(filename_or_stream_or_string, self) else: _xml_sax.parseString(filename_or_stream_or_string, self) else: _xml_sax.parse(filename_or_stream_or_string, self) self.__maximized = self.__minimized = False def __getattr__(self, name): 'Dynamically create and bind Methods.' self.__dict__[name] = Method(self.__stream, name) return self.__dict__[name] def __iter__(self): 'Return an iterator.' return iter(self.__stream) def parse(self, handler): 'Simulate events on a handler.' for event in self: event(handler) def maximize(self, style): 'Prepare the stream for printing.' if not self.__maximized: self.minimize() self.__minimized = False self.__maximized = True if isinstance(self.__stream[0], setDocumentLocator): index = 2 else: index = 1 level = 0 cancel = False while True: event = self.__stream[index] if isinstance(event, (startPrefixMapping, startElement, startElementNS)): self.__stream.insert(index, characters(style * level)) index += 2 if not isinstance(self.__stream[index], (endDocument, endPrefixMapping, endElement, endElementNS)): self.__stream.insert(index, characters('\n')) index += 1 level += 1 elif isinstance(event, (endPrefixMapping, endElement, endElementNS)): if not isinstance(self.__stream[index - 1], (startDocument, startPrefixMapping, startElement, startElementNS)): level -= 1 if cancel: cancel = False index += 1 else: self.__stream.insert(index, characters(style * level)) index += 2 else: index += 1 self.__stream.insert(index, characters('\n')) index += 1 elif isinstance(event, endDocument): break elif isinstance(event, characters): del self.__stream[index - 1] cancel = True def minimize(self): 'Prepare the stream for data extraction.' if not self.__minimized: self.__maximized = False self.__minimized = True if isinstance(self.__stream[0], setDocumentLocator): index = 2 else: index = 1 inside = True while index < len(self.__stream): event = self.__stream[index] if isinstance(event, (startPrefixMapping, startElement, startElementNS)): inside = True index = self.__prune(index) elif isinstance(event, (endDocument, endPrefixMapping, endElement, endElementNS)): if inside: inside = False index = self.__join(index) else: index = self.__prune(index) index += 1 def __prune(self, index): 'Private class method.' temp = index - 1 event = self.__stream[temp] while not isinstance(event, (startDocument, startPrefixMapping, endPrefixMapping, startElement, endElement, startElementNS, endElementNS)): if isinstance(event, characters): del self.__stream[temp] index -= 1 temp -= 1 event = self.__stream[temp] return index def __join(self, index): 'Private class method.' temp = index - 1 event_1 = self.__stream[temp] while not isinstance(event_1, (startDocument, startPrefixMapping, startElement, startElementNS)): if isinstance(event_1, characters): event_2 = self.__stream[temp - 1] if isinstance(event_2, characters): self.__stream[temp] = characters(event_2()[0] + event_1()[0]) del self.__stream[temp - 1] index -= 1 temp -= 1 event_1 = self.__stream[temp] return index ################################################################################ class Method: 'Method(stream, name) -> Method' def __init__(self, stream, name): 'Initialize the Method object.' self.__stream = stream self.__name = name def __call__(self, *args): 'Dynamically create and add events to the stream.' self.__stream.append(globals()[self.__name](*args)) ################################################################################ if __name__ == '__main__': _sys.stdout.write('Content-Type: text/plain\n\n') _sys.stdout.write(file(_sys.argv[0]).read()) #=============================================================================== # htbin\z_cgi.py #=============================================================================== '''Support module for use by CGI scripts. This module provides several functions and variables that help with printing text and accessing form data.''' __version__ = 1.3 ################################################################################ class File: def __init__(*args, **kwargs): pass def flush(*args, **kwargs): pass def isatty(*args, **kwargs): pass def write(*args, **kwargs): pass def writelines(*args, **kwargs): pass ################################################################################ import sys out = sys.stdout sys.stdout = File() def execute(main, exception): 'Execute main unless exception.' if exception != string: main() else: print_self() def print_html(text): 'Print text as HTML.' out.write('Content-Type: text/html\n\n' + text) sys.exit(0) def print_plain(text): 'Print text as plain.' out.write('Content-Type: text/plain\n\n' + text) sys.exit(0) def print_self(): 'Print __main__ as plain.' print_plain(file(sys.argv[0]).read()) ################################################################################ import os def export(): 'Exports string and dictionary.' global string, dictionary try: string = str(os.environ['QUERY_STRING']) except: try: string = sys.stdin.read() except: string = str() try: dictionary = dict([(decode(parameter), decode(value)) for parameter, value in [item.split('=') for item in string.replace('+', ' ').split('&')]]) except: dictionary = dict() def decode(string): 'Receives, decodes, and returns string.' index = string.find('%') while index != -1: string = string[:index] + chr(int(string[index+1:index+3], 16)) + string[index+3:] index = string.find('%', index + 1) return string ################################################################################ if __name__ == '__main__': print_self() else: export() #=============================================================================== # htbin\z_html.py #=============================================================================== '''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.__special = z_matrix.Matrix(rows, columns, False) 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 special(self, row, column, special): self.__special[row][column] = special 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"' % (key, attributes[key]) for key in sorted(attributes)]) def html(self): 'Returns the HTML code for the current table.' html = self.__indent_style * self.__indent_level + '\n' for row, s_row in zip(self.__matrix, self.__special): html += self.__indent_style * (self.__indent_level + 1) + '\n' for cell, special in zip(row, s_row): html += self.__indent_style * (self.__indent_level + 2) + '\n' if special: html += cell + '\n' else: 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 special(self, day, special): row, column = self.__row_column(day) self.__table.special(row, column, special) 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() #=============================================================================== # htbin\z_matrix.py #=============================================================================== '''Module for arrays and matrices. This module provides the Array and Matrix classes which create mutable storage with immutable size.''' __version__ = 1.0 ################################################################################ class Array: 'Array(length[, value]) -> Array' def __init__(self, length, value=None): 'Initialize the Array object.' assert isinstance(length, int) and length > 0 self.__data = [value] * length def __repr__(self): 'Return the object\'s representation.' return repr(self.__data) def __len__(self): 'Return the object\'s length.' return len(self.__data) def __getitem__(self, key): 'Return the specified item.' return self.__data[key] def __setitem__(self, key, value): 'Assign the value to the key.' self.__data[key] = value def __delitem__(self, key): 'Delete the specified item.' self.__data[key] = None def __itet__(self): 'Return the object\'s iterator.' return iter(self.__data) def __contains__(self, item): 'Return the item\'s membership status.' return item in self.__data class Matrix: 'Matrix(rows, columns[, value]) -> Matrix' def __init__(self, rows, columns, value=None): 'Initialize the Matrix object.' assert isinstance(rows, int) and rows > 0 self.__data = [Array(columns, value) for row in range(rows)] def __repr__(self): 'Return the object\'s representation.' return repr(self.__data) def __len__(self): 'Return the object\'s length.' return len(self.__data) def __getitem__(self, key): 'Return the specified item.' return self.__data[key] def __setitem__(self, key, value): 'Assign the value to the key.' self.__data[key] = Array(len(self.__data[key]), value) def __delitem__(self, key): 'Delete the specified item.' self.__data[key] = Array(len(self.__data[key])) def __iter__(self): 'Return the object\'s iterator.' return iter(self.__data) def __contains__(self, item): 'Return the item\'s membership status.' for row in self.__data: if item in row: return True return False ################################################################################ if __name__ == '__main__': import sys sys.stdout.write('Content-Type: text/plain\n\n' + file(sys.argv[0]).read())