blob: ede1d169e6a80d497540dd7a62d6f7ae75d143a6 [file] [log] [blame]
Fred Drakedd244a01998-02-09 22:17:52 +00001#! /usr/bin/env python
2
3"""Combine similar index entries into an entry and subentries.
4
5For example:
6
7 \item {foobar} (in module flotz), 23
8 \item {foobar} (in module whackit), 4323
9
10becomes
11
12 \item {foobar}
13 \subitem in module flotz, 23
14 \subitem in module whackit, 4323
15
16Note that an item which matches the format of a collapsable item but which
17isn't part of a group of similar items is not modified.
18"""
19__version__ = '$Revision$'
20
21import re
22import string
23import StringIO
24import sys
25
26
Fred Drakea94d21f1998-02-10 21:35:49 +000027def cmp_entries(e1, e2, lower=string.lower):
Fred Drakedd244a01998-02-09 22:17:52 +000028 return cmp(lower(e1[1]), lower(e2[1])) or cmp(e1, e2)
29
30
Fred Drakea94d21f1998-02-10 21:35:49 +000031def dump_entries(write, entries):
Fred Drakedd244a01998-02-09 22:17:52 +000032 if len(entries) == 1:
Fred Drakea94d21f1998-02-10 21:35:49 +000033 write(" \\item %s (%s)%s\n" % entries[0])
Fred Drakedd244a01998-02-09 22:17:52 +000034 return
Fred Drakea94d21f1998-02-10 21:35:49 +000035 write(" \item %s\n" % entries[0][0])
Fred Drakedd244a01998-02-09 22:17:52 +000036 # now sort these in a case insensitive manner:
Fred Drakea94d21f1998-02-10 21:35:49 +000037 if len(entries) > 0:
38 entries.sort(cmp_entries)
Fred Drakedd244a01998-02-09 22:17:52 +000039 for xxx, subitem, pages in entries:
Fred Drakea94d21f1998-02-10 21:35:49 +000040 write(" \subitem %s%s\n" % (subitem, pages))
Fred Drakedd244a01998-02-09 22:17:52 +000041
42
43breakable_re = re.compile(r" \\item (.*) [(](.*)[)]((?:, \d+)+)")
44
45def main():
46 import getopt
47 outfile = None
48 opts, args = getopt.getopt(sys.argv[1:], "o:")
49 for opt, val in opts:
50 if opt in ("-o", "--output"):
51 outfile = val
52 filename = args[0]
53 outfile = outfile or filename
54 if filename == "-":
55 fp = sys.stdin
56 else:
57 fp = open(filename)
58 ofp = StringIO.StringIO()
Fred Drakedd244a01998-02-09 22:17:52 +000059 entries = []
Fred Drakea94d21f1998-02-10 21:35:49 +000060 match = breakable_re.match
61 write = ofp.write
Fred Drakedd244a01998-02-09 22:17:52 +000062 while 1:
63 line = fp.readline()
64 if not line:
65 break
Fred Drakea94d21f1998-02-10 21:35:49 +000066 m = match(line)
Fred Drakedd244a01998-02-09 22:17:52 +000067 if m:
68 entry = m.group(1, 2, 3)
Fred Drakea94d21f1998-02-10 21:35:49 +000069 if entries and entries[-1][0] != entry[0]:
70 dump_entries(write, entries)
71 entries = []
Fred Drakedd244a01998-02-09 22:17:52 +000072 entries.append(entry)
73 elif entries:
Fred Drakea94d21f1998-02-10 21:35:49 +000074 dump_entries(write, entries)
Fred Drakedd244a01998-02-09 22:17:52 +000075 entries = []
Fred Drakea94d21f1998-02-10 21:35:49 +000076 write(line)
Fred Drakedd244a01998-02-09 22:17:52 +000077 else:
Fred Drakea94d21f1998-02-10 21:35:49 +000078 write(line)
79 del write
80 del match
Fred Drakedd244a01998-02-09 22:17:52 +000081 fp.close()
82 if outfile == "-":
83 fp = sys.stdout
84 else:
85 fp = open(outfile, "w")
86 fp.write(ofp.getvalue())
87 fp.close()
88
89
90if __name__ == "__main__":
91 main()