blob: ca643b3494be901a48251d4a9770598ccf6b78ff [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Guido van Rossumec758ea1991-06-04 20:36:54 +00002
3# ptags
4#
5# Create a tags file for Python programs, usable with vi.
6# Tagged are:
7# - functions (even inside other defs or classes)
8# - classes
9# - filenames
10# Warns about files it cannot open.
11# No warnings about duplicate tags.
12
Guido van Rossum1688f372000-09-01 13:41:37 +000013import sys, re, os
Guido van Rossumec758ea1991-06-04 20:36:54 +000014
Guido van Rossum1688f372000-09-01 13:41:37 +000015tags = [] # Modified global variable!
Guido van Rossumec758ea1991-06-04 20:36:54 +000016
17def main():
Guido van Rossum1688f372000-09-01 13:41:37 +000018 args = sys.argv[1:]
Andrew M. Kuchlingac6df952003-05-13 18:14:25 +000019 for filename in args:
20 treat_file(filename)
Guido van Rossum1688f372000-09-01 13:41:37 +000021 if tags:
22 fp = open('tags', 'w')
23 tags.sort()
24 for s in tags: fp.write(s)
Guido van Rossumec758ea1991-06-04 20:36:54 +000025
Guido van Rossumf2e1cfb1992-08-31 10:53:53 +000026
Guido van Rossum1688f372000-09-01 13:41:37 +000027expr = '^[ \t]*(def|class)[ \t]+([a-zA-Z0-9_]+)[ \t]*[:\(]'
28matcher = re.compile(expr)
Guido van Rossumec758ea1991-06-04 20:36:54 +000029
Andrew M. Kuchlingac6df952003-05-13 18:14:25 +000030def treat_file(filename):
Guido van Rossum1688f372000-09-01 13:41:37 +000031 try:
Andrew M. Kuchlingac6df952003-05-13 18:14:25 +000032 fp = open(filename, 'r')
Guido van Rossum1688f372000-09-01 13:41:37 +000033 except:
Andrew M. Kuchlingac6df952003-05-13 18:14:25 +000034 sys.stderr.write('Cannot open %s\n' % filename)
Guido van Rossum1688f372000-09-01 13:41:37 +000035 return
Andrew M. Kuchlingac6df952003-05-13 18:14:25 +000036 base = os.path.basename(filename)
Guido van Rossum1688f372000-09-01 13:41:37 +000037 if base[-3:] == '.py':
38 base = base[:-3]
Andrew M. Kuchlingac6df952003-05-13 18:14:25 +000039 s = base + '\t' + filename + '\t' + '1\n'
Guido van Rossum1688f372000-09-01 13:41:37 +000040 tags.append(s)
41 while 1:
42 line = fp.readline()
Tim Peters70c43782001-01-17 08:48:39 +000043 if not line:
Guido van Rossum1688f372000-09-01 13:41:37 +000044 break
45 m = matcher.match(line)
46 if m:
47 content = m.group(0)
48 name = m.group(2)
Andrew M. Kuchlingac6df952003-05-13 18:14:25 +000049 s = name + '\t' + filename + '\t/^' + content + '/\n'
Guido van Rossum1688f372000-09-01 13:41:37 +000050 tags.append(s)
Guido van Rossumec758ea1991-06-04 20:36:54 +000051
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000052if __name__ == '__main__':
53 main()