-
Notifications
You must be signed in to change notification settings - Fork 1
/
erebusconv.py
104 lines (77 loc) · 2.46 KB
/
erebusconv.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# -*- coding: utf-8 -*-
from xml.etree import ElementTree as ET
from icalendar import Calendar, Event
from icalendar.cal import Component
from CNode import *
from Visitor.ToStringVisitor import *
import sys
# imported for icalendar hacking
from icalendar import vDDDTypes
from icalendar.cal import types_factory
from icalendar.parser import Parameters
def ical2cnode(ical):
"""Convert an ical calendar to a tree of cnodes
ical: icalendar.Calendar
return CNode
"""
r = CNode(name=ical.name)
for k,v in ical.iteritems():
r.attr[k] = v
for child in ical.walk():
if child == ical: continue
cnode = ical2cnode(child)
if cnode.content != '':
r.add_child(cnode)
return r
def cnode2ical(cnode):
"""Convert a tree of cnodes to an ical calendar
cnode: typically from Erebus2ICSVisitor
return: icalendar.Calendar
"""
comp = Component()
comp.name = cnode.name.upper()
for k,v in cnode.attr.iteritems():
# If an attribute is a CNode, say n, we must add all the
# attributes of n as parameters to the iCalendar element. We
# first encode the value to the corresponding iCalendar value
# (with types_factory, like icalendar.Component does
# internally), and then add the parameters.
if v.__class__ == CNode:
target_class = types_factory.for_property(k)
val = target_class(v.content)
val.params = Parameters()
for p,pv in v.attr.iteritems():
val.params[p] = pv
comp.add(k, val, encode=0)
else:
comp.add(k, v, encode=1)
for c in cnode.children:
comp.add_component(cnode2ical(c))
return comp
def xml2cnode(xml):
"""Convert an arbitrary xml structure to a tree of cnodes
xml: xml.etree.ElementTree.Element type
return: CNode
"""
r = CNode(name=xml.tag)
r.content = xml.text
for k,v in xml.attrib.iteritems():
r.attr[k] = v
for c in xml.getchildren():
e = xml2cnode(c)
r.add_child(e)
return r
def cnode2xml(cnode):
"""Convert a tree of cnodes to XML
cnode: typically from Erebus2EWSVisitor
return: xml.etree.ElementTree
"""
r = ET.Element(cnode.name)
for k,v in cnode.attr.iteritems():
r.set(k,v)
for c in cnode.children:
ch = cnode2xml(c)
r.append(ch)
if cnode.content:
r.text = cnode.content
return r