[Python-checkins] r42210 - sandbox/trunk/pycon/parse-sched.py sandbox/trunk/pycon/parse_sched.py
david.goodger
python-checkins at python.org
Tue Jan 31 16:26:21 CET 2006
Author: david.goodger
Date: Tue Jan 31 16:26:21 2006
New Revision: 42210
Added:
sandbox/trunk/pycon/parse_sched.py
- copied unchanged from r42208, sandbox/trunk/pycon/parse-sched.py
Removed:
sandbox/trunk/pycon/parse-sched.py
Log:
renamed to parse_sched to make importable
Deleted: /sandbox/trunk/pycon/parse-sched.py
==============================================================================
--- /sandbox/trunk/pycon/parse-sched.py Tue Jan 31 16:26:21 2006
+++ (empty file)
@@ -1,229 +0,0 @@
-#!/usr/bin/env python
-
-# Reads a page with a wiki-format table
-
-# Basic data structure of dictionary:
-# {(year, month, day) -> [(room, time, duration, title)]
-
-import sys, optparse
-import re, string
-import pprint, cgi
-import datetime
-
-import talks
-
-date_pat = re.compile('^=\s+(\d{4})-(\d{2})-(\d{1,2})\s+.*\s+=')
-line_pat = re.compile('[|]{2}.*[|]{2}\s*$')
-talk_pat = re.compile('#(\d+)')
-
-def parse (lines):
- lines = map(string.strip, lines)
- d = {}
- date = None
-
- for line in lines:
- m = date_pat.match(line)
- if m:
- date = [int(value) for value in m.group(1,2,3)]
- date = tuple(date)
-
- m = line_pat.match(line)
- if m:
- if date is None:
- print >>sys.stderr, "Table line before date header: %r" % line
- else:
- L = line.split('||')
- L = map(string.strip, L)
- assert L[0] == ''
- assert L[-1] == ''
- L = L[1:-1]
- if len(L) != 4:
- print >>sys.stderr, "Wrong number of fields in line: %r" % line
- # Skip headers
- elif L[0].lower() == 'room':
- pass
- else:
- event_list = d.setdefault(date, [])
- t = canonicalize_presentation(L)
- event_list.append(t)
-
- return d
-
-
-time_pat = re.compile('(\d+):(\d+)')
-
-def parse_time (S):
- """(str): (int, int)
- Parse a time into an (hour, minute) tuple.
- """
- m = time_pat.match(S)
- assert m is not None
- hour, min = int(m.group(1)), int(m.group(2))
- return hour, min
-
-
-def canonicalize_presentation (L):
- """Take a 4-item list for a talk and perform various
- corrections to it.
- """
- hour, min = parse_time(L[1])
- L[1] = '%02i:%02i' % (hour, min)
- L[2] = int(L[2])
- return tuple(L)
-
-
-
-#
-# HTML generation functions
-#
-
-def add_time (start_time, duration):
- hour, min = parse_time(start_time)
- while duration > 60:
- hour += 1
- duration -= 60
- min += duration
- while min >= 60:
- hour += 1
- min -= 60
- return '%02i:%02i' % (hour, min)
-
-def find_next_time (time_list, end_time):
- if len(time_list) == 0:
- return 1
- span = 0
- while (span < len(time_list) and time_list[span][0] < end_time):
- span += 1
- if span == len(time_list):
- return 1
- return span+1
-
-
-def format_day (day, output):
- # Figure out unique rooms
- rooms = []
- for room, time, duration, title in day:
- # XXX change to use regex pattern
- if room.startswith('-'):
- continue
- if room not in rooms:
- rooms.append(room)
- rooms.sort()
-
- # Move Bent Tree to be last
- if 'Bent Tree' in rooms:
- rooms.remove('Bent Tree')
- rooms.append('Bent Tree')
-
- # Print room header
- print >>output, '''<table width="80%%" border=3>
-<col width="75"><col span=%i width="*">
-''' % len(rooms)
-
- print >>output, "<thead>"
- print >>output, '<tr><td></td>',
- for room in rooms:
- print >>output, '<th>%s</th>' % room,
- print >>output, '</tr>'
- print >>output, "</thead>"
-
- # Sort list
- time_dict = {}
- for room, time, duration, title in day:
- d = time_dict.setdefault(time, {})
- d[room] = (duration, title)
- time_list = time_dict.items()
- time_list.sort()
-
- active = {}
- print '<tbody>'
- while len(time_list) > 0:
- time, room_dict = time_list.pop(0)
- print >>output, '<tr>',
- for act_room, end_time in active.items():
- if end_time <= time:
- del active[act_room]
- print >>output, '<th>%s</th>' % time,
- plenary = (len(room_dict) == 1 and room_dict.keys()[0] == '---')
- if plenary:
- # Plenary session of some sort
- duration, title = room_dict.values()[0]
- colspan = len(rooms)
- print >>output, '<td align="center" colspan=%i>%s</td>' % (colspan, title),
- print >>output, '</tr>'
- continue
-
- for room in rooms:
- # Room still occupied, so skip it
- if room in active:
- continue
-
- # New room
- t = room_dict.get(room)
- if t is None:
- print >>output, '<td rowspan=1> </td>',
- else:
- duration, title = t
- end_time = add_time(time, duration)
- active[room] = end_time
- rowspan = find_next_time(time_list, end_time)
-
- # Turn talk numbers into a link with a title
- m = talk_pat.match(title)
- if m is not None:
- talk_num = int(m.group(1))
- title = talks.get_title(talk_num)
- url = ('http://wiki.python.org/moin/PyCon2006/Talks#%s'
- % talk_num)
- title = '%s (<a href="%s">%s</a>)' % (cgi.escape(title),
- url, talk_num)
- else:
- title = cgi.escape(title)
-
- print >>output, '<td rowspan="%i">' % rowspan,
- print >>output, title,
- print >>output, '</td>',
-
- print >>output, '</tr>'
-
- print '</tbody>'
- print >>output, '</table>'
-
-
-def output_html (d, output):
- L = d.items() ; L.sort()
-
- for (y, m, day), day_data in L:
- date = datetime.date(y, m, day)
- print >>output, date.strftime('<h3>%A, %B %d %Y</h3>')
- format_day(day_data, output)
-
-
-def main ():
- parser = optparse.OptionParser(usage="usage: %prog [options] < final-schedule")
- parser.add_option('--format',
- type='choice',
- choices=['pickle', 'python', 'print', 'html'],
- default='print',
- action="store", dest="format",
- help = "Select output format")
- options, args = parser.parse_args()
-
- d = parse(lines=sys.stdin.readlines())
- fmt = options.format
- if fmt == 'print':
- pprint.pprint(d)
- elif fmt == 'python':
- print 'schedule =',
- pprint.pprint(d)
- elif fmt == 'pickle':
- import cPickle
- cPickle.dump(d, sys.stdout)
- elif fmt == 'html':
- output_html(d, sys.stdout)
- else:
- print >>sys.stderr, "Unknown format %r" % fmt
- sys.exit(1)
-
-if __name__ == '__main__':
- main()
More information about the Python-checkins
mailing list