mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			89 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#! /usr/bin/env python
 | 
						|
 | 
						|
"""Parse event definitions out of comments in source files."""
 | 
						|
 | 
						|
import sys
 | 
						|
import glob
 | 
						|
import fileinput
 | 
						|
import pprint
 | 
						|
 | 
						|
def main():
 | 
						|
    hits = []
 | 
						|
    sublist = []
 | 
						|
    args = sys.argv[1:]
 | 
						|
    if not args:
 | 
						|
        args = filter(lambda s: 'A' <= s[0] <= 'Z', glob.glob("*.py"))
 | 
						|
        if not args:
 | 
						|
            print "No arguments, no [A-Z]*.py files."
 | 
						|
            return 1
 | 
						|
    for line in fileinput.input(args):
 | 
						|
        if line[:2] == '#$':
 | 
						|
            if not sublist:
 | 
						|
                sublist.append('file %s' % fileinput.filename())
 | 
						|
                sublist.append('line %d' % fileinput.lineno())
 | 
						|
            sublist.append(line[2:-1].strip())
 | 
						|
        else:
 | 
						|
            if sublist:
 | 
						|
                hits.append(sublist)
 | 
						|
                sublist = []
 | 
						|
    if sublist:
 | 
						|
        hits.append(sublist)
 | 
						|
        sublist = []
 | 
						|
    dd = {}
 | 
						|
    for sublist in hits:
 | 
						|
        d = {}
 | 
						|
        for line in sublist:
 | 
						|
            words = line.split(None, 1)
 | 
						|
            if len(words) != 2:
 | 
						|
                continue
 | 
						|
            tag = words[0]
 | 
						|
            l = d.get(tag, [])
 | 
						|
            l.append(words[1])
 | 
						|
            d[tag] = l
 | 
						|
        if d.has_key('event'):
 | 
						|
            keys = d['event']
 | 
						|
            if len(keys) != 1:
 | 
						|
                print "Multiple event keys in", d
 | 
						|
                print 'File "%s", line %d' % (d['file'], d['line'])
 | 
						|
            key = keys[0]
 | 
						|
            if dd.has_key(key):
 | 
						|
                print "Duplicate event in", d
 | 
						|
                print 'File "%s", line %d' % (d['file'], d['line'])
 | 
						|
                return
 | 
						|
            dd[key] = d
 | 
						|
        else:
 | 
						|
            print "No event key in", d
 | 
						|
            print 'File "%s", line %d' % (d['file'], d['line'])
 | 
						|
    winevents = getevents(dd, "win")
 | 
						|
    unixevents = getevents(dd, "unix")
 | 
						|
    save = sys.stdout
 | 
						|
    f = open("keydefs.py", "w")
 | 
						|
    try:
 | 
						|
        sys.stdout = f
 | 
						|
        print "windows_keydefs = \\"
 | 
						|
        pprint.pprint(winevents)
 | 
						|
        print
 | 
						|
        print "unix_keydefs = \\"
 | 
						|
        pprint.pprint(unixevents)
 | 
						|
    finally:
 | 
						|
        sys.stdout = save
 | 
						|
    f.close()
 | 
						|
 | 
						|
def getevents(dd, key):
 | 
						|
    res = {}
 | 
						|
    events = dd.keys()
 | 
						|
    events.sort()
 | 
						|
    for e in events:
 | 
						|
        d = dd[e]
 | 
						|
        if d.has_key(key) or d.has_key("all"):
 | 
						|
            list = []
 | 
						|
            for x in d.get(key, []) + d.get("all", []):
 | 
						|
                list.append(x)
 | 
						|
                if key == "unix" and x[:5] == "<Alt-":
 | 
						|
                    x = "<Meta-" + x[5:]
 | 
						|
                    list.append(x)
 | 
						|
            res[e] = list
 | 
						|
    return res
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    sys.exit(main())
 |