1.1 --- a/EventAggregatorSupport/Types.py Tue Jan 14 16:39:26 2014 +0100
1.2 +++ b/EventAggregatorSupport/Types.py Tue Jan 14 23:55:27 2014 +0100
1.3 @@ -12,11 +12,18 @@
1.4 from GeneralSupport import to_list
1.5 from LocationSupport import getMapReference
1.6 from MoinSupport import *
1.7 +import vCalendar
1.8
1.9 +from codecs import getreader
1.10 from email.utils import parsedate
1.11 import re
1.12
1.13 try:
1.14 + from cStringIO import StringIO
1.15 +except ImportError:
1.16 + from StringIO import StringIO
1.17 +
1.18 +try:
1.19 set
1.20 except NameError:
1.21 from sets import Set as set
1.22 @@ -28,6 +35,45 @@
1.23
1.24 # Event parsing from page texts.
1.25
1.26 +def parseEventsInPage(text, page, fragment=None):
1.27 +
1.28 + """
1.29 + Parse events in the given 'text' from the given 'page'.
1.30 + """
1.31 +
1.32 + # Calendar-format pages are parsed directly by the iCalendar parser.
1.33 +
1.34 + if page.getFormat() == "calendar":
1.35 + return parseEventsInCalendar(text)
1.36 +
1.37 + # Wiki-format pages are parsed region-by-region using the special markup.
1.38 +
1.39 + elif page.getFormat() == "wiki":
1.40 +
1.41 + # Where a page contains events, potentially in regions, identify the page
1.42 + # regions and obtain the events within them.
1.43 +
1.44 + events = []
1.45 + for format, attributes, region in getFragments(text, True):
1.46 + if format == "calendar":
1.47 + events += parseEventsInCalendar(region)
1.48 + else:
1.49 + events += parseEvents(region, page, attributes.get("fragment") or fragment)
1.50 + return events
1.51 +
1.52 + # Unsupported format pages return no events.
1.53 +
1.54 + else:
1.55 + return []
1.56 +
1.57 +def parseEventsInCalendar(text):
1.58 +
1.59 + # Make a Unicode-capable StringIO.
1.60 +
1.61 + f = getreader("utf-8")(StringIO(text.encode("utf-8")))
1.62 + calendar = EventCalendar("", vCalendar.parse(f), {})
1.63 + return calendar.getEvents()
1.64 +
1.65 def parseEvents(text, event_page, fragment=None):
1.66
1.67 """
1.68 @@ -360,10 +406,7 @@
1.69 "Return a list of events from this page."
1.70
1.71 if self.events is None:
1.72 - self.events = []
1.73 - if self.getFormat() == "wiki":
1.74 - for format, attributes, region in getFragments(self.getBody(), True):
1.75 - self.events += parseEvents(region, self, attributes.get("fragment"))
1.76 + self.events = parseEventsInPage(self.page.data, self)
1.77
1.78 return self.events
1.79
1.80 @@ -530,7 +573,11 @@
1.81 fmt.page = page = self.page
1.82 request = page.request
1.83
1.84 - parser_cls = self.getParserClass(self.getFormat())
1.85 + if self.getFormat() == "calendar":
1.86 + parser_cls = RawParser
1.87 + else:
1.88 + parser_cls = self.getParserClass(self.getFormat())
1.89 +
1.90 return formatText(text, request, fmt, parser_cls)
1.91
1.92 # Event details.