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.
2.1 --- a/README.txt Tue Jan 14 16:39:26 2014 +0100
2.2 +++ b/README.txt Tue Jan 14 23:55:27 2014 +0100
2.3 @@ -359,7 +359,7 @@
2.4
2.5 * Added support for remote iCalendar event sources using particular content
2.6 types instead of text/calendar.
2.7 - * Improved formatting of iCalendar pages and regions.
2.8 + * Added aggregation and improved formatting of iCalendar pages and regions.
2.9
2.10 New in EventAggregator 0.10.2 (Changes since EventAggregator 0.10.1)
2.11 --------------------------------------------------------------------
3.1 --- a/parsers/calendar.py Tue Jan 14 16:39:26 2014 +0100
3.2 +++ b/parsers/calendar.py Tue Jan 14 23:55:27 2014 +0100
3.3 @@ -9,14 +9,8 @@
3.4 from MoinSupport import parseAttributes, RawParser
3.5 from EventAggregatorSupport.Formatting import formatEventsForOutputType, \
3.6 formatEvent
3.7 -from EventAggregatorSupport.Types import parseEvents, EventCalendar
3.8 -from codecs import getreader
3.9 -import vCalendar
3.10 -
3.11 -try:
3.12 - from cStringIO import StringIO
3.13 -except ImportError:
3.14 - from StringIO import StringIO
3.15 +from EventAggregatorSupport.Types import parseEventsInPage, EventPage, \
3.16 + parseEventsInCalendar
3.17
3.18 Dependencies = ["pages"]
3.19
3.20 @@ -58,12 +52,7 @@
3.21 using the request.
3.22 """
3.23
3.24 - # Make a Unicode-capable StringIO.
3.25 -
3.26 - f = getreader("utf-8")(StringIO(self.raw.encode("utf-8")))
3.27 - calendar = EventCalendar("", vCalendar.parse(f), {})
3.28 -
3.29 - for event in calendar.getEvents():
3.30 + for event in parseEventsInCalendar(self.raw):
3.31 formatEvent(event, self.request, fmt, write=write, parser_cls=RawParser)
3.32
3.33 # Extra API methods.
3.34 @@ -81,11 +70,8 @@
3.35 if mimetype == "text/calendar":
3.36 (write or request.write)(self.raw)
3.37 else:
3.38 - # Make a Unicode-capable StringIO.
3.39 -
3.40 - f = getreader("utf-8")(StringIO(self.raw.encode("utf-8")))
3.41 - calendar = EventCalendar("", vCalendar.parse(f), {})
3.42 - formatEventsForOutputType(calendar.getEvents(), self.request, mimetype, write=write)
3.43 + events = parseEventsInCalendar(self.raw)
3.44 + formatEventsForOutputType(events, self.request, mimetype, write=write)
3.45
3.46 # Class methods.
3.47
4.1 --- a/parsers/event.py Tue Jan 14 16:39:26 2014 +0100
4.2 +++ b/parsers/event.py Tue Jan 14 23:55:27 2014 +0100
4.3 @@ -8,7 +8,7 @@
4.4
4.5 from MoinSupport import parseAttributes
4.6 from EventAggregatorSupport.Formatting import formatEvent, formatEventsForOutputType
4.7 -from EventAggregatorSupport.Types import parseEvents, EventPage
4.8 +from EventAggregatorSupport.Types import parseEventsInPage, EventPage
4.9
4.10 Dependencies = ["pages"]
4.11
4.12 @@ -46,9 +46,7 @@
4.13 using the request.
4.14 """
4.15
4.16 - events = parseEvents(self.raw, EventPage(self.request.page), self.fragment)
4.17 -
4.18 - for event in events:
4.19 + for event in parseEventsInPage(self.raw, EventPage(self.request.page), self.fragment):
4.20 formatEvent(event, self.request, fmt, write=write)
4.21
4.22 # Extra API methods.
4.23 @@ -61,7 +59,7 @@
4.24 request.
4.25 """
4.26
4.27 - events = parseEvents(self.raw, EventPage(self.request.page), self.fragment)
4.28 + events = parseEventsInPage(self.raw, EventPage(self.request.page), self.fragment)
4.29 formatEventsForOutputType(events, self.request, mimetype, write=write)
4.30
4.31 # Class methods.