# HG changeset patch # User Paul Boddie # Date 1371256093 -7200 # Node ID ed323a24bde04ea12e8fa000868c70ad18f345c8 # Parent 8f794f5f0ba17e181acb55c030ccc9bd5cde7373 Added an iCalendar parser. diff -r 8f794f5f0ba1 -r ed323a24bde0 README.txt --- a/README.txt Sat Jun 15 02:27:21 2013 +0200 +++ b/README.txt Sat Jun 15 02:28:13 2013 +0200 @@ -358,6 +358,7 @@ -------------------------------------------------------------------- * Fixed iCalendar event writing. + * Added an iCalendar parser. New in EventAggregator 0.10.1 (Changes since EventAggregator 0.10) ------------------------------------------------------------------ diff -r 8f794f5f0ba1 -r ed323a24bde0 parsers/calendar.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/parsers/calendar.py Sat Jun 15 02:28:13 2013 +0200 @@ -0,0 +1,90 @@ +# -*- coding: iso-8859-1 -*- +""" + MoinMoin - calendar (EventAggregator) + + @copyright: 2012, 2013 by Paul Boddie + @license: GNU GPL (v2 or later), see COPYING.txt for details. +""" + +from MoinSupport import parseAttributes +from EventAggregatorSupport.Formatting import formatEventsForOutputType +from EventAggregatorSupport.Types import parseEvents, EventCalendar +from codecs import getreader +import vCalendar + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +Dependencies = ["pages"] + +# Parser support. + +class Parser: + + "Interpret and show calendar information in different ways." + + Dependencies = Dependencies + extensions = [".ics"] + + # Input content types understood by this parser. + + input_mimetypes = ["text/calendar"] + + # Output content types preferred by this parser. + + output_mimetypes = ["text/html", "text/calendar"] + + def __init__(self, raw, request, **kw): + + """ + Initialise the parser with the given 'raw' data, 'request' and any + keyword arguments that may have been supplied. + """ + + self.raw = raw + self.request = request + attrs = parseAttributes(kw.get("format_args", ""), False) + + self.fragment = attrs.get("fragment") + + def format(self, fmt, write=None): + + """ + Format a calendar using the given formatter 'fmt'. If the 'write' + parameter is specified, use it to write output; otherwise, write output + using the request. + """ + + (write or self.request.write)(fmt.text(self.raw)) + + # Extra API methods. + + def formatForOutputType(self, mimetype, write=None): + + """ + Format a calendar for the given 'mimetype'. If the 'write' parameter is + specified, use it to write output; otherwise, write output using the + request. + """ + + # Write raw calendar information unchanged. + + if mimetype == "text/calendar": + (write or request.write)(self.raw) + else: + # Make a Unicode-capable StringIO. + + f = getreader("utf-8")(StringIO(self.raw.encode("utf-8"))) + calendar = EventCalendar("", vCalendar.parse(f), {}) + formatEventsForOutputType(calendar.getEvents(), self.request, mimetype, write=write) + + # Class methods. + + def getOutputTypes(self): + return self.output_mimetypes + + getOutputTypes = classmethod(getOutputTypes) + +# vim: tabstop=4 expandtab shiftwidth=4