Mercurial > hg > python
changeset 60:bc1acb1416ab
working on fixing gnus home foulup, see /disk/scratch/{mail,gnus}
author | Henry S. Thompson <ht@inf.ed.ac.uk> |
---|---|
date | Wed, 13 Dec 2023 17:31:28 +0000 |
parents | dd63412fc882 |
children | 19262b15a099 |
files | repair.py |
diffstat | 1 files changed, 69 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/repair.py Wed Dec 13 17:31:28 2023 +0000 @@ -0,0 +1,69 @@ +import lisparser + +def readAlist(fn): + with open(fn,'r') as f: + sline = f.readline() + alines = [l for l in f if (L:=l).startswith("(")] + return sline, alist(alines), L + +def alist(lines): + res = {} + for l in lines: + ll = lisparser.get_ast(lisparser.normalize_str(l))[0] + k = ll.pop(0) + n = ll.pop(0) + t = ll.pop(0) + pp = dict((a[0],a[1:]) for a in ll.pop(0)) if ll else None + res[eval(k)]=(n, t, pp, ll) + return res + +def p2l(pl, f, top = False): + if isinstance(pl,list) or isinstance(pl,tuple): + if len(pl) == 0: + f.write('nil') + else: + f.write('(') + space = False + for e in pl: + if space: + f.write(' ') + p2l(e,f) + else: + p2l(e,f) + space = True + f.write(')') + elif isinstance(pl,dict): + if top: + f.write("(setq gnus-newsrc-alist '(\n") + space = False + for k, v in pl.items(): + if space: + f.write('%s('%('\n' if top else ' ')) + else: + f.write('(' if top else '((') + space = True + if top: + f.write('"%s"'%k) + else: + f.write(k) + for e in v: + if e: + # 4th tuple, from tail of original (ref 'll' in alist), may be empty + f.write(' ') + p2l(e,f) + f.write(')') + if top: + f.write('\n))\n') + else: + f.write(')') + elif isinstance(pl,str): + if pl in ['.','nil']: + f.write(pl) + else: + try: + int(pl) + f.write(pl) + except ValueError: + f.write('"%s"'%pl) + else: + f.write(pl)