| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  | #! /usr/bin/env python | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Combine similar index entries into an entry and subentries.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For example: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \item {foobar} (in module flotz), 23 | 
					
						
							|  |  |  |     \item {foobar} (in module whackit), 4323 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | becomes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \item {foobar} | 
					
						
							|  |  |  |       \subitem in module flotz, 23 | 
					
						
							|  |  |  |       \subitem in module whackit, 4323 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Note that an item which matches the format of a collapsable item but which | 
					
						
							|  |  |  | isn't part of a group of similar items is not modified. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | __version__ = '$Revision$' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import re | 
					
						
							|  |  |  | import string | 
					
						
							|  |  |  | import StringIO | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  | def cmp_entries(e1, e2, lower=string.lower): | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  |     return cmp(lower(e1[1]), lower(e2[1])) or cmp(e1, e2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  | def dump_entries(write, entries): | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  |     if len(entries) == 1: | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  | 	write("  \\item %s (%s)%s\n" % entries[0]) | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  | 	return | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  |     write("  \item %s\n" % entries[0][0]) | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  |     # now sort these in a case insensitive manner: | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  |     if len(entries) > 0: | 
					
						
							|  |  |  | 	entries.sort(cmp_entries) | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  |     for xxx, subitem, pages in entries: | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  | 	write("    \subitem %s%s\n" % (subitem, pages)) | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-02-19 06:05:29 +00:00
										 |  |  | breakable_re = re.compile( | 
					
						
							|  |  |  |     r"  \\item (.*) [(](.*)[)]((?:(?:, \d+)|(?:, \\[a-z]*\{\d+\}))+)") | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-03-03 19:36:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def process(ifn, ofn=None): | 
					
						
							|  |  |  |     if ifn == "-": | 
					
						
							|  |  |  |         ifp = sys.stdin | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											1999-03-03 19:36:23 +00:00
										 |  |  |         ifp = open(ifn) | 
					
						
							|  |  |  |     if ofn is None: | 
					
						
							|  |  |  |         ofn = ifn | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  |     ofp = StringIO.StringIO() | 
					
						
							|  |  |  |     entries = [] | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  |     match = breakable_re.match | 
					
						
							|  |  |  |     write = ofp.write | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  |     while 1: | 
					
						
							| 
									
										
										
										
											1999-03-03 19:36:23 +00:00
										 |  |  | 	line = ifp.readline() | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  | 	if not line: | 
					
						
							|  |  |  | 	    break | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  | 	m = match(line) | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  | 	if m: | 
					
						
							|  |  |  | 	    entry = m.group(1, 2, 3) | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  | 	    if entries and entries[-1][0] != entry[0]: | 
					
						
							|  |  |  | 		dump_entries(write, entries) | 
					
						
							|  |  |  | 		entries = [] | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  | 	    entries.append(entry) | 
					
						
							|  |  |  | 	elif entries: | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  | 	    dump_entries(write, entries) | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  | 	    entries = [] | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  | 	    write(line) | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  | 	else: | 
					
						
							| 
									
										
										
										
											1998-02-10 21:35:49 +00:00
										 |  |  | 	    write(line) | 
					
						
							|  |  |  |     del write | 
					
						
							|  |  |  |     del match | 
					
						
							| 
									
										
										
										
											1999-03-03 19:36:23 +00:00
										 |  |  |     ifp.close() | 
					
						
							|  |  |  |     data = ofp.getvalue() | 
					
						
							|  |  |  |     ofp.close() | 
					
						
							|  |  |  |     if ofn == "-": | 
					
						
							|  |  |  | 	ofp = sys.stdout | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											1999-03-03 19:36:23 +00:00
										 |  |  | 	ofp = open(ofn, "w") | 
					
						
							|  |  |  |     ofp.write(data) | 
					
						
							|  |  |  |     ofp.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  |     import getopt | 
					
						
							|  |  |  |     outfile = None | 
					
						
							|  |  |  |     opts, args = getopt.getopt(sys.argv[1:], "o:") | 
					
						
							|  |  |  |     for opt, val in opts: | 
					
						
							|  |  |  | 	if opt in ("-o", "--output"): | 
					
						
							|  |  |  | 	    outfile = val | 
					
						
							|  |  |  |     filename = args[0] | 
					
						
							|  |  |  |     outfile = outfile or filename | 
					
						
							|  |  |  |     process(filename, outfile) | 
					
						
							| 
									
										
										
										
											1998-02-09 22:17:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     main() |