mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	
		
			
	
	
		
			94 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | #! /usr/bin/env python | ||
|  | 
 | ||
|  | """Parse event definitions out of comments in source files.""" | ||
|  | 
 | ||
|  | import re | ||
|  | import sys | ||
|  | import os | ||
|  | import string | ||
|  | import getopt | ||
|  | 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(string.strip(line[2:-1])) | ||
|  |         else: | ||
|  |             if sublist: | ||
|  |                 hits.append(sublist) | ||
|  |                 sublist = [] | ||
|  |     if sublist: | ||
|  |         hits.append(sublist) | ||
|  |         sublist = [] | ||
|  |     dd = {} | ||
|  |     for sublist in hits: | ||
|  |         d = {} | ||
|  |         for line in sublist: | ||
|  |             words = string.split(line, 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()) |