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)