Initial import to Tizen
[profile/ivi/python-pyOpenSSL.git] / doc / tools / indfix.py
1 #! /usr/bin/env python
2
3 """Combine similar index entries into an entry and subentries.
4
5 For example:
6
7     \item {foobar} (in module flotz), 23
8     \item {foobar} (in module whackit), 4323
9
10 becomes
11
12     \item {foobar}
13       \subitem in module flotz, 23
14       \subitem in module whackit, 4323
15
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: 1.1.1.1 $'
20
21 import re
22 import string
23 import StringIO
24 import sys
25
26
27 def cmp_entries(e1, e2, lower=string.lower):
28     return cmp(lower(e1[1]), lower(e2[1])) or cmp(e1, e2)
29
30
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))
41
42
43 breakable_re = re.compile(
44     r"  \\item (.*) [(](.*)[)]((?:(?:, \d+)|(?:, \\[a-z]*\{\d+\}))+)")
45
46
47 def process(ifn, ofn=None):
48     if ifn == "-":
49         ifp = sys.stdin
50     else:
51         ifp = open(ifn)
52     if ofn is None:
53         ofn = ifn
54     ofp = StringIO.StringIO()
55     entries = []
56     match = breakable_re.match
57     write = ofp.write
58     while 1:
59         line = ifp.readline()
60         if not line:
61             break
62         m = match(line)
63         if m:
64             entry = m.group(1, 2, 3)
65             if entries and entries[-1][0] != entry[0]:
66                 dump_entries(write, entries)
67                 entries = []
68             entries.append(entry)
69         elif entries:
70             dump_entries(write, entries)
71             entries = []
72             write(line)
73         else:
74             write(line)
75     del write
76     del match
77     ifp.close()
78     data = ofp.getvalue()
79     ofp.close()
80     if ofn == "-":
81         ofp = sys.stdout
82     else:
83         ofp = open(ofn, "w")
84     ofp.write(data)
85     ofp.close()
86
87
88 def main():
89     import getopt
90     outfile = None
91     opts, args = getopt.getopt(sys.argv[1:], "o:")
92     for opt, val in opts:
93         if opt in ("-o", "--output"):
94             outfile = val
95     filename = args[0]
96     outfile = outfile or filename
97     process(filename, outfile)
98
99
100 if __name__ == "__main__":
101     main()