blob: 5bab0fb8c3ffda7de05779bb48d214e305bcd334 [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
Fred Drakedd244a01998-02-09 22:17:52 +000022import StringIO
23import sys
24
25
Fred Drake071972e2002-10-16 15:30:17 +000026def cmp_entries(e1, e2):
27 return cmp(e1[1].lower(), e2[1].lower()) or cmp(e1, e2)
Fred Drakedd244a01998-02-09 22:17:52 +000028
29
Fred Drakea94d21f1998-02-10 21:35:49 +000030def dump_entries(write, entries):
Fred Drakedd244a01998-02-09 22:17:52 +000031 if len(entries) == 1:
Fred Drake77878412000-10-07 12:50:05 +000032 write(" \\item %s (%s)%s\n" % entries[0])
33 return
Fred Drakea94d21f1998-02-10 21:35:49 +000034 write(" \item %s\n" % entries[0][0])
Fred Drakedd244a01998-02-09 22:17:52 +000035 # now sort these in a case insensitive manner:
Fred Drakea94d21f1998-02-10 21:35:49 +000036 if len(entries) > 0:
Fred Drake77878412000-10-07 12:50:05 +000037 entries.sort(cmp_entries)
Fred Drakedd244a01998-02-09 22:17:52 +000038 for xxx, subitem, pages in entries:
Fred Drake77878412000-10-07 12:50:05 +000039 write(" \subitem %s%s\n" % (subitem, pages))
Fred Drakedd244a01998-02-09 22:17:52 +000040
41
Fred Drakec02fbe51998-02-19 06:05:29 +000042breakable_re = re.compile(
43 r" \\item (.*) [(](.*)[)]((?:(?:, \d+)|(?:, \\[a-z]*\{\d+\}))+)")
Fred Drakedd244a01998-02-09 22:17:52 +000044
Fred Drake749f9431999-03-03 19:36:23 +000045
46def process(ifn, ofn=None):
47 if ifn == "-":
48 ifp = sys.stdin
Fred Drakedd244a01998-02-09 22:17:52 +000049 else:
Fred Drake749f9431999-03-03 19:36:23 +000050 ifp = open(ifn)
51 if ofn is None:
52 ofn = ifn
Fred Drakedd244a01998-02-09 22:17:52 +000053 ofp = StringIO.StringIO()
Fred Drakedd244a01998-02-09 22:17:52 +000054 entries = []
Fred Drakea94d21f1998-02-10 21:35:49 +000055 match = breakable_re.match
56 write = ofp.write
Fred Drakedd244a01998-02-09 22:17:52 +000057 while 1:
Fred Drake77878412000-10-07 12:50:05 +000058 line = ifp.readline()
59 if not line:
60 break
61 m = match(line)
62 if m:
63 entry = m.group(1, 2, 3)
64 if entries and entries[-1][0] != entry[0]:
65 dump_entries(write, entries)
66 entries = []
67 entries.append(entry)
68 elif entries:
69 dump_entries(write, entries)
70 entries = []
71 write(line)
72 else:
73 write(line)
Fred Drakea94d21f1998-02-10 21:35:49 +000074 del write
75 del match
Fred Drake749f9431999-03-03 19:36:23 +000076 ifp.close()
77 data = ofp.getvalue()
78 ofp.close()
79 if ofn == "-":
Fred Drake77878412000-10-07 12:50:05 +000080 ofp = sys.stdout
Fred Drakedd244a01998-02-09 22:17:52 +000081 else:
Fred Drake77878412000-10-07 12:50:05 +000082 ofp = open(ofn, "w")
Fred Drake749f9431999-03-03 19:36:23 +000083 ofp.write(data)
84 ofp.close()
85
86
87def main():
88 import getopt
89 outfile = None
90 opts, args = getopt.getopt(sys.argv[1:], "o:")
91 for opt, val in opts:
Fred Drake77878412000-10-07 12:50:05 +000092 if opt in ("-o", "--output"):
93 outfile = val
Fred Drake749f9431999-03-03 19:36:23 +000094 filename = args[0]
95 outfile = outfile or filename
96 process(filename, outfile)
Fred Drakedd244a01998-02-09 22:17:52 +000097
98
99if __name__ == "__main__":
100 main()