Move setting of ioready 'wait' earlier in call chain, to
[python/dscho.git] / Doc / tools / mkmodindex
blob8e869f9266be5c4a6ca51ef5548722e7e82fa025
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 os
29 import re
30 import sys
32 from xml.sax.saxutils import quoteattr
34 import buildindex
35 import support
38 class IndexOptions(support.Options):
39 aesop_type = "links"
41 def __init__(self):
42 support.Options.__init__(self)
43 self.add_args("l", ["letters"])
44 self.letters = 0
46 def handle_option(self, opt, val):
47 if opt in ("-l", "--letters"):
48 self.letters = 1
50 def usage(self):
51 program = os.path.basename(sys.argv[0])
52 print __doc__ % {"program": program}
54 links = [
55 ('author', 'acks.html', 'Acknowledgements'),
56 ('help', 'about.html', 'About the Python Documentation'),
59 def get_header(self):
60 header = support.Options.get_header(self)
61 s = ''
62 for rel, href, title in self.links:
63 s += '<link rel="%s" href="%s"' % (rel, href)
64 if title:
65 s += ' title=' + quoteattr(title)
66 s += '>\n '
67 return header.replace("<link ", s + "<link ", 1)
70 class Node(buildindex.Node):
71 def __init__(self, link, str, seqno, platinfo):
72 self.annotation = platinfo or None
73 if str[0][-5:] == "</tt>":
74 str = str[:-5]
75 self.modname = str
76 buildindex.Node.__init__(self, link, self.modname, seqno)
77 if platinfo:
78 s = '<tt class="module">%s</tt> %s' \
79 % (self.modname, self.annotation)
80 else:
81 s = '<tt class="module">%s</tt>' % str
82 self.text = [s]
84 def __str__(self):
85 if self.annotation:
86 return '<tt class="module">%s</tt> %s' \
87 % (self.modname, self.annotation)
88 else:
89 return '<tt class="module">%s</tt>' % self.modname
91 _rx = re.compile(
92 "<dt><a href=['\"](module-.*\.html)(?:#l2h-\d+)?['\"]>"
93 "<tt class=['\"]module['\"]>([a-zA-Z_][a-zA-Z0-9_.]*)</tt>\s*(<em>"
94 "\(<span class=['\"]platform['\"]>.*</span>\)</em>)?</a>")
96 def main():
97 options = IndexOptions()
98 options.variables["title"] = "Global Module Index"
99 options.parse(sys.argv[1:])
100 args = options.args
101 if not args:
102 args = ["-"]
104 # Collect the input data:
106 nodes = []
107 has_plat_flag = 0
108 for ifn in args:
109 if ifn == "-":
110 ifp = sys.stdin
111 dirname = ''
112 else:
113 ifp = open(ifn)
114 dirname = os.path.dirname(ifn)
115 while 1:
116 line = ifp.readline()
117 if not line:
118 break
119 m = _rx.match(line)
120 if m:
121 # This line specifies a module!
122 basename, modname, platinfo = m.group(1, 2, 3)
123 has_plat_flag = has_plat_flag or platinfo
124 linkfile = os.path.join(dirname, basename)
125 nodes.append(Node('<a href="%s">' % linkfile, modname,
126 len(nodes), platinfo))
127 ifp.close()
129 # Generate all output:
131 num_nodes = len(nodes)
132 # Here's the HTML generation:
133 parts = [options.get_header(),
134 buildindex.process_nodes(nodes, options.columns, options.letters),
135 options.get_footer(),
137 if has_plat_flag:
138 parts.insert(1, PLAT_DISCUSS)
139 html = ''.join(parts)
140 program = os.path.basename(sys.argv[0])
141 fp = options.get_output_file()
142 fp.write(html.rstrip() + "\n")
143 if options.outputfile == "-":
144 sys.stderr.write("%s: %d index nodes\n" % (program, num_nodes))
145 else:
146 print
147 print "%s: %d index nodes" % (program, num_nodes)
150 PLAT_DISCUSS = """
151 <p> Some module names are followed by an annotation indicating what
152 platform they are available on.</p>
157 if __name__ == "__main__":
158 main()