Another abandoned server code base... this is kind of an ancestor of taskrambler.
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

"""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:])