-
Notifications
You must be signed in to change notification settings - Fork 0
/
imc.py
70 lines (55 loc) · 1.49 KB
/
imc.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
def toDict(imc: str, suffix: str = '+param') -> dict:
mkkey = lambda s: s.lower().replace('-', '_')
result = { 'LAST:END': True }
lines = []
for fileline in imc.split('\n'):
if fileline[0:1] in [' ', '\t']:
fileline = lines.pop() + fileline[1:]
if fileline != '':
lines.append(fileline)
for line in lines:
k, v = line.split(':', maxsplit = 1)
k, *p = k.split(';')
v = v.replace('\\n', '\n').replace('\r', '')
x = f'END:{v}'
if k == 'BEGIN':
new = { x: result }
result.setdefault(mkkey(v), []).append(new)
result = new
continue
if k == 'END':
result = result.pop(x)
continue
k = mkkey(k)
x = k + suffix
p = { mkkey(pk): pv for ps in p for pk, pv in [ ps.split('=', maxsplit = 1) ] }
result[k] = v
result[x] = p
if result[x] == {}:
del result[x]
del result['LAST:END']
return result
def fromDict(imcdict: dict, suffix: str = '+param') -> str:
mkkey = lambda s: s.upper().replace('_', '-')
result = ''
for k, v in imcdict.items():
if k.endswith(suffix):
continue
x = k + suffix
k = mkkey(k)
if isinstance(v, list):
for item in v:
result += f'BEGIN:{k}\n'
result += fromDict(item, suffix)
result += f'END:{k}\n'
continue
v = v.replace('\n', '\\n')
p = imcdict.get(x, {})
p = [ '='.join([ mkkey(pk), pv ]) for pk, pv in p.items() ]
line = ';'.join([ k ] + p)
line = ':'.join([ line, v ])
while len(line) > 64:
result += line[0:64] + '\n'
line = ' ' + line[64:]
result += line + '\n'
return result