Oops -- Lib/Test should be Lib/test, of course!
[python/dscho.git] / Doc / tools / indfix.py
blob395f095e75126852dc7a6b28250c2329131cc624
1 #! /usr/bin/env python
3 """Combine similar index entries into an entry and subentries.
5 For example:
7 \item {foobar} (in module flotz), 23
8 \item {foobar} (in module whackit), 4323
10 becomes
12 \item {foobar}
13 \subitem in module flotz, 23
14 \subitem in module whackit, 4323
16 Note that an item which matches the format of a collapsable item but which
17 isn't part of a group of similar items is not modified.
18 """
19 __version__ = '$Revision$'
21 import re
22 import string
23 import StringIO
24 import sys
27 def cmp_entries(e1, e2, lower=string.lower):
28 return cmp(lower(e1[1]), lower(e2[1])) or cmp(e1, e2)
31 def dump_entries(write, entries):
32 if len(entries) == 1:
33 write(" \\item %s (%s)%s\n" % entries[0])
34 return
35 write(" \item %s\n" % entries[0][0])
36 # now sort these in a case insensitive manner:
37 if len(entries) > 0:
38 entries.sort(cmp_entries)
39 for xxx, subitem, pages in entries:
40 write(" \subitem %s%s\n" % (subitem, pages))
43 breakable_re = re.compile(
44 r" \\item (.*) [(](.*)[)]((?:(?:, \d+)|(?:, \\[a-z]*\{\d+\}))+)")
46 def main():
47 import getopt
48 outfile = None
49 opts, args = getopt.getopt(sys.argv[1:], "o:")
50 for opt, val in opts:
51 if opt in ("-o", "--output"):
52 outfile = val
53 filename = args[0]
54 outfile = outfile or filename
55 if filename == "-":
56 fp = sys.stdin
57 else:
58 fp = open(filename)
59 ofp = StringIO.StringIO()
60 entries = []
61 match = breakable_re.match
62 write = ofp.write
63 while 1:
64 line = fp.readline()
65 if not line:
66 break
67 m = match(line)
68 if m:
69 entry = m.group(1, 2, 3)
70 if entries and entries[-1][0] != entry[0]:
71 dump_entries(write, entries)
72 entries = []
73 entries.append(entry)
74 elif entries:
75 dump_entries(write, entries)
76 entries = []
77 write(line)
78 else:
79 write(line)
80 del write
81 del match
82 fp.close()
83 if outfile == "-":
84 fp = sys.stdout
85 else:
86 fp = open(outfile, "w")
87 fp.write(ofp.getvalue())
88 fp.close()
91 if __name__ == "__main__":
92 main()