You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
1.9 KiB
89 lines
1.9 KiB
"""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:])
|