1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - calendar (EventAggregator) 4 5 @copyright: 2012, 2013, 2014 by Paul Boddie <paul@boddie.org.uk> 6 @license: GNU GPL (v2 or later), see COPYING.txt for details. 7 """ 8 9 from MoinSupport import parseAttributes, RawParser 10 from EventAggregatorSupport.Formatting import formatEventsForOutputType, \ 11 formatEvent 12 from EventAggregatorSupport.Types import parseEvents, EventCalendar 13 from codecs import getreader 14 import vCalendar 15 16 try: 17 from cStringIO import StringIO 18 except ImportError: 19 from StringIO import StringIO 20 21 Dependencies = ["pages"] 22 23 # Parser support. 24 25 class Parser: 26 27 "Interpret and show calendar information in different ways." 28 29 Dependencies = Dependencies 30 extensions = [".ics"] 31 32 # Input content types understood by this parser. 33 34 input_mimetypes = ["text/calendar"] 35 36 # Output content types preferred by this parser. 37 38 output_mimetypes = ["text/html", "text/calendar"] 39 40 def __init__(self, raw, request, **kw): 41 42 """ 43 Initialise the parser with the given 'raw' data, 'request' and any 44 keyword arguments that may have been supplied. 45 """ 46 47 self.raw = raw 48 self.request = request 49 attrs = parseAttributes(kw.get("format_args", ""), False) 50 51 self.fragment = attrs.get("fragment") 52 53 def format(self, fmt, write=None): 54 55 """ 56 Format a calendar using the given formatter 'fmt'. If the 'write' 57 parameter is specified, use it to write output; otherwise, write output 58 using the request. 59 """ 60 61 # Make a Unicode-capable StringIO. 62 63 f = getreader("utf-8")(StringIO(self.raw.encode("utf-8"))) 64 calendar = EventCalendar("", vCalendar.parse(f), {}) 65 66 for event in calendar.getEvents(): 67 formatEvent(event, self.request, fmt, write=write, parser_cls=RawParser) 68 69 # Extra API methods. 70 71 def formatForOutputType(self, mimetype, write=None): 72 73 """ 74 Format a calendar for the given 'mimetype'. If the 'write' parameter is 75 specified, use it to write output; otherwise, write output using the 76 request. 77 """ 78 79 # Write raw calendar information unchanged. 80 81 if mimetype == "text/calendar": 82 (write or request.write)(self.raw) 83 else: 84 # Make a Unicode-capable StringIO. 85 86 f = getreader("utf-8")(StringIO(self.raw.encode("utf-8"))) 87 calendar = EventCalendar("", vCalendar.parse(f), {}) 88 formatEventsForOutputType(calendar.getEvents(), self.request, mimetype, write=write) 89 90 # Class methods. 91 92 def getOutputTypes(self): 93 return self.output_mimetypes 94 95 getOutputTypes = classmethod(getOutputTypes) 96 97 # vim: tabstop=4 expandtab shiftwidth=4