blob: 784dc907c7b03e75f757485e48b1a95b23f3f67d [file] [log] [blame]
Guido van Rossum504b0bf1999-01-02 21:28:54 +00001#! /usr/bin/env python
2
3"""Parse event definitions out of comments in source files."""
4
5import re
6import sys
7import os
Guido van Rossum504b0bf1999-01-02 21:28:54 +00008import getopt
9import glob
10import fileinput
11import pprint
12
13def main():
14 hits = []
15 sublist = []
16 args = sys.argv[1:]
17 if not args:
18 args = filter(lambda s: 'A' <= s[0] <= 'Z', glob.glob("*.py"))
19 if not args:
20 print "No arguments, no [A-Z]*.py files."
21 return 1
22 for line in fileinput.input(args):
23 if line[:2] == '#$':
24 if not sublist:
25 sublist.append('file %s' % fileinput.filename())
26 sublist.append('line %d' % fileinput.lineno())
Walter Dörwaldaaab30e2002-09-11 20:36:02 +000027 sublist.append(line[2:-1].strip())
Guido van Rossum504b0bf1999-01-02 21:28:54 +000028 else:
29 if sublist:
30 hits.append(sublist)
31 sublist = []
32 if sublist:
33 hits.append(sublist)
34 sublist = []
35 dd = {}
36 for sublist in hits:
37 d = {}
38 for line in sublist:
Walter Dörwaldaaab30e2002-09-11 20:36:02 +000039 words = line.split(None, 1)
Guido van Rossum504b0bf1999-01-02 21:28:54 +000040 if len(words) != 2:
41 continue
42 tag = words[0]
43 l = d.get(tag, [])
44 l.append(words[1])
45 d[tag] = l
46 if d.has_key('event'):
47 keys = d['event']
48 if len(keys) != 1:
49 print "Multiple event keys in", d
50 print 'File "%s", line %d' % (d['file'], d['line'])
51 key = keys[0]
52 if dd.has_key(key):
53 print "Duplicate event in", d
54 print 'File "%s", line %d' % (d['file'], d['line'])
55 return
56 dd[key] = d
57 else:
58 print "No event key in", d
59 print 'File "%s", line %d' % (d['file'], d['line'])
60 winevents = getevents(dd, "win")
61 unixevents = getevents(dd, "unix")
62 save = sys.stdout
63 f = open("keydefs.py", "w")
64 try:
65 sys.stdout = f
66 print "windows_keydefs = \\"
67 pprint.pprint(winevents)
68 print
69 print "unix_keydefs = \\"
70 pprint.pprint(unixevents)
71 finally:
72 sys.stdout = save
73 f.close()
74
75def getevents(dd, key):
76 res = {}
77 events = dd.keys()
78 events.sort()
79 for e in events:
80 d = dd[e]
81 if d.has_key(key) or d.has_key("all"):
82 list = []
83 for x in d.get(key, []) + d.get("all", []):
84 list.append(x)
85 if key == "unix" and x[:5] == "<Alt-":
86 x = "<Meta-" + x[5:]
87 list.append(x)
88 res[e] = list
89 return res
90
91if __name__ == '__main__':
92 sys.exit(main())