"""icsxml -- convert iCalendar data to XML Convert to XHTML, RDF or other XML format using kid templates. """ import codecs import kid from icslex import unbreak, properties, asDate, recurlex, unesc def main(args): import sys tpl = kid.Template(file=args[0]) tpl.events = events(args[1:]) tpl.contacts = tpl.events #@@ kludge tpl.when = '2006-04-08@@' for s in tpl.generate(output='xml', encoding='utf-8'): sys.stdout.write(s) def events(files): for fn in files: lines = unbreak(codecs.open(fn, encoding='utf-8')) while 1: obj = {} try: delim, name = properties(lines, obj) except StopIteration: break if obj.has_key('dtstart'): fixvalues(obj) yield obj if (delim, name) == ('end', 'VCARD'): #@@kludge fixvalues(obj) yield obj def fixvalues(obj): for k in obj.keys(): params = obj[k] val = params['_'] for p in params.keys(): if not (p == '_' or (p == 'charset' and params[p] == 'UTF-8')): warn("throwing away: params", k, params) if k in ('dtstart', 'dtend'): val = asDate(val) elif k == 'rrule': val = recurlex(val) elif k == 'n': warn("struct", k, val) structured_text(params, val, ('family-name', 'given-name', 'additional-name', 'honorific-prefix', 'honorific-suffix')) val = params else: val = unesc(val) obj[k] = val obj['id'] = id(obj) #@@kludge for k in ('dtstamp', 'dtend', 'summary'): #@@kludge if not obj.has_key(k): obj[k] = asDate('20050124T205828Z') def structured_text(obj, val, keys): for comp, key in zip(val.split(";"), keys): obj[key] = comp def warn(*args): import sys sys.stderr.write(' '.join([unicode(a).encode('utf-8') for a in args])) sys.stderr.write("\n") def _test(): import doctest doctest.testmod() if __name__ == '__main__': import sys if '--test' in sys.argv: _test() else: main(sys.argv[1:])