Merged release21-maint changes.
[python/dscho.git] / Doc / tools / mkmodindex
blob23a200e7eb33af0025ed1b58636bbc34a482c422
1 #! /usr/bin/env python
2 # -*- Python -*-
4 """usage: %(program)s [options] file...
6 Supported options:
8 --address addr
9 -a addr Set the address text to include at the end of the generated
10 HTML; this should be used for contact information.
11 --columns cols
12 -c cols Set the number of columns each index section should be
13 displayed in. The default is 1.
14 --help
15 -h Display this help message.
16 --letters
17 -l Split the output into sections by letter.
18 --output file
19 -o file Write output to 'file' instead of standard out.
20 --iconserver is Use 'is' as the directory containing icons for the
21 navigation bar. The default is 'icons'.
22 --title str Set the page title to 'str'. The default is 'Global
23 Module Index'.
24 --uplink url Set the upward link URL. The default is './'.
25 --uptitle str Set the upward link title. The default is 'Python
26 Documentation Index'.
27 """
28 import buildindex
29 import os
30 import re
31 import string
32 import support
33 import sys
36 class IndexOptions(support.Options):
37 def __init__(self):
38 support.Options.__init__(self)
39 self.add_args("l", ["letters"])
40 self.letters = 0
42 def handle_option(self, opt, val):
43 if opt in ("-l", "--letters"):
44 self.letters = 1
46 def usage(self):
47 program = os.path.basename(sys.argv[0])
48 print __doc__ % {"program": program}
51 class Node(buildindex.Node):
52 def __init__(self, link, str, seqno, platinfo):
53 self.annotation = platinfo or None
54 if str[0][-5:] == "</tt>":
55 str = str[:-5]
56 self.modname = str
57 buildindex.Node.__init__(self, link, self.modname, seqno)
58 if platinfo:
59 s = '<tt class="module">%s</tt> %s' \
60 % (self.modname, self.annotation)
61 else:
62 s = '<tt class="module">%s</tt>' % str
63 self.text = [s]
65 def __str__(self):
66 if self.annotation:
67 return '<tt class="module">%s</tt> %s' \
68 % (self.modname, self.annotation)
69 else:
70 return '<tt class="module">%s</tt>' % self.modname
72 _rx = re.compile(
73 "<dt><a href=['\"](module-.*\.html)(?:#l2h-\d+)?['\"]>"
74 "<tt class=['\"]module['\"]>([a-zA-Z_][a-zA-Z0-9_.]*)</tt>\s*(<em>"
75 "\(<span class=['\"]platform['\"]>.*</span>\)</em>)?</a>")
77 def main():
78 options = IndexOptions()
79 options.variables["title"] = "Global Module Index"
80 options.parse(sys.argv[1:])
81 args = options.args
82 if not args:
83 args = ["-"]
85 # Collect the input data:
87 nodes = []
88 has_plat_flag = 0
89 for ifn in args:
90 if ifn == "-":
91 ifp = sys.stdin
92 dirname = ''
93 else:
94 ifp = open(ifn)
95 dirname = os.path.dirname(ifn)
96 while 1:
97 line = ifp.readline()
98 if not line:
99 break
100 m = _rx.match(line)
101 if m:
102 # This line specifies a module!
103 basename, modname, platinfo = m.group(1, 2, 3)
104 has_plat_flag = has_plat_flag or platinfo
105 linkfile = os.path.join(dirname, basename)
106 nodes.append(Node('<a href="%s">' % linkfile, modname,
107 len(nodes), platinfo))
108 ifp.close()
110 # Generate all output:
112 num_nodes = len(nodes)
113 # Here's the HTML generation:
114 parts = [options.get_header(),
115 buildindex.process_nodes(nodes, options.columns, options.letters),
116 options.get_footer(),
118 if has_plat_flag:
119 parts.insert(1, PLAT_DISCUSS)
120 html = string.join(parts, '')
121 program = os.path.basename(sys.argv[0])
122 fp = options.get_output_file()
123 fp.write(string.rstrip(html) + "\n")
124 if options.outputfile == "-":
125 sys.stderr.write("%s: %d index nodes\n" % (program, num_nodes))
126 else:
127 print
128 print "%s: %d index nodes" % (program, num_nodes)
131 PLAT_DISCUSS = """
132 <p> Some module names are followed by an annotation indicating what
133 platform they are available on.</p>
138 if __name__ == "__main__":
139 main()