#!/usr/bin/python """evt1htm.py Generate HTML calendars This module reads a text file containing event information and generates a calendar web page containing the events in each day in a nicely formatted table written by manny juan manny@jps.net 09/15/97 11/18/97 - added international option and week starting with monday formatting options: python evt1htm.py 9 1997 sdpw cellopt pfx >w.htm sdpw=1 sun thru sat sdpw=2 mon thru fri sdpw=3 mon thru sat cellopt=1 embolden 1st word cellopt=2 alternate emboldening events alnopt=1 left align event text alnopt=2 center align event text """ import sys from calend2 import * import string,regsub import cgi from calnames import * def go(): print "Content-type: text/html" # identify response as HTML print # end of headers print "Event Calendar Generator" try: # eg query = "M=April&Y=1987" try: # have the cgi module parse the data for you... form = cgi.FieldStorage() MField = form["M"] YField = form["Y"] EvtField = form["events"] except (KeyError, TypeError): print "Sorry, I need both Month and Year",Mfield,YField,EvtField raise SystemExit try: LangField = form["lang"] DpwField = form["sdpw"] CelField = form["cellopt"] FmtField = form["fmtopt"] AlnField = form["cellalign"] MsgField = form["msg"] except (KeyError): pass # get the values of the fields try: M = MField.value Y = YField.value events=string.split(EvtField.value,'\n') except AttributeError: print "Sorry, Multiple months or multiple years are not allowed." raise SystemExit # get the values of the fields try: sdpwv = DpwField.value celloptv = CelField.value fmtoptv = FmtField.value alnoptv = AlnField.value msg=MsgField.value except AttributeError: print "Sorry, Multiple values for Days per week and/or Format options are not allowed" raise SystemExit # print "sdpwv="+sdpwv # convert the month and year to a number try: mth = string.atoi(M) year = string.atoi(Y) except ValueError: print "
OOPS: year or month isn't a number (!) " + `Y` + ',' + `M` raise SystemExit try: lang = string.atoi(LangField.value) except ValueError: lang = 1 try: sdpw = string.atoi(sdpwv) except ValueError: sdpw = 1 try: cellopt = string.atoi(celloptv) except ValueError: cellopt = 1 try: fmtopt = string.atoi(fmtoptv) except ValueError: fmtopt = 1 try: alnopt = string.atoi(alnoptv) except ValueError: alnopt = 1 prmonth(year, mth, lang, sdpw, cellopt, fmtopt, alnopt, msg, events) finally: print '
Event calendar automatically generated by Python script', print ' evt1htm.cgi', print " found at manny juan's python page" print '' def prmonth(year, month, lang, sdpw, cellopt, fmtopt, alnopt, msg, events): evt,evtstore,maxdd,count = parse_events(year,month,events) gen_cal(year,month,lang,sdpw,cellopt,fmtopt,alnopt,msg,maxdd,count,evt,evtstore) import regex # comment expression cmtpat = regex.compile('^ *\#') # date mm/dd datepat = regex.compile('^ *\([0-9*][0-9]?\)[/]\([0-9][0-9]?\)') # any word wordpat = regex.compile('^ *\([^ *\t*]+\)') # dot color (eg. ".blue") dotcpat = regex.compile('^ *\.[a-zA-Z]+') def parse_events(year,month,events): maxdd=0 evn=0 evt={} evtstore={} count={} daysinmonth=mdays[month] if (isleap(year) & (month==2)): daysinmonth=daysinmonth+1 for day in range(daysinmonth+1): count[day]=0 for line in events: if string.strip(line) == '': #skip blank lines continue if cmtpat.search(line) > -1: continue # first token must be date eg. 12/31 if datepat.search(line) > -1: xmonth , xday = datepat.group(1,2) mth=string.atoi(xmonth) # select only the days for the month selected if mth==month: day=string.atoi(xday) line=line[datepat.regs[0][1]:] evn=evn+1 count[day]=count[day]+1 # keep track of cell height if (count[day]>maxdd): maxdd=count[day] # store event number and text evt[(day,count[day])]=evn evtstore[evn]=line return (evt,evtstore,maxdd,count) def gen_cal(year,month,lang,sdpw,cellopt,fmtopt,alnopt,msg,maxdd,count,evt,evtstore): begweek=0 if(sdpw==1): dayw=80 elif(sdpw==2): dayw=93 elif(sdpw==3): dayw=112 else: dayw=80 begweek=1 weeks=monthcalendar(year,month,begweek) evseq=0 print '
' month_name,week_name=month_lits[lang-1] print ''+month_name[month-1],str(year)+'' if len(msg)>0: print '
'+msg print '' if (fmtopt==2): fmtspan='colspan=2' extracell='' else: fmtspan='' extracell='' if((sdpw==1)|(sdpw==4)): print '' for week in weeks: if (fmtopt==2): print '' dow=0 for day in week: if (((sdpw==1)|(sdpw==4)) |((sdpw==2) & (dow>0)) |((sdpw==3) & (dow>0) & (dow<6))): print '0): print 'width=5>'+str(day), else: print '>', print '%s' % extracell dow=dow+1 print '' print '' dow=0 for day in week: if (((sdpw==1)|(sdpw==4)) |((sdpw==2) & (dow>0)) |((sdpw==3) & (dow>0) & (dow<6))): print '' print '' print '
%s'%(dayw,fmtspan,week_name[(0+begweek)%7]) print '%s'%(dayw,fmtspan,week_name[(1+begweek)%7]) print '%s'%(dayw,fmtspan,week_name[(2+begweek)%7]) print '%s'%(dayw,fmtspan,week_name[(3+begweek)%7]) print '%s'%(dayw,fmtspan,week_name[(4+begweek)%7]) print '%s'%(dayw,fmtspan,week_name[(5+begweek)%7]) if((sdpw==1)|(sdpw==2)|(sdpw==4)): print '%s'%(dayw,fmtspan,week_name[(6+begweek)%7]) print '
'%fmtspan, if(day>0): for i in range(maxdd): if ((fmtopt==1) & (i==0)): print '',day,'','
' if (alnopt==2): print '
' if i>count[day]-1: print ' 
' else: evn=evt[(day,i+1)] event=evtstore[evn] # convert caret's to
event=regsub.gsub(' *\^ *','
',event) # convert vertical bars to
event=regsub.gsub('|','
',event) # convert beginning codes like '.red' to fontcolor tag if dotcpat.search(event) > -1: event=string.strip(event[dotcpat.regs[0][1]:]) color=dotcpat.group(0) color=regsub.gsub(' *\.','',color) event=''+event+'' # this will also be the listing sequence (and link) evseq=evseq+1 if (cellopt==1): evtext=event if (((day+i)%2)==1): evtext=embolden(event) print evtext,'
' else: print event,'
' if (alnopt==2): print '
' print '
' dow=dow+1 print '
' def embolden(s): return ''+s+'' if __name__ == '__main__': go()