blob: 8e869f9266be5c4a6ca51ef5548722e7e82fa025 [file] [log] [blame]
Fred Drake2ef38a71999-02-24 17:33:07 +00001#! /usr/bin/env python
2# -*- Python -*-
3
Fred Drake5f7832d1999-03-04 21:19:57 +00004"""usage: %(program)s [options] file...
5
6Supported options:
7
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"""
Fred Drake2ef38a71999-02-24 17:33:07 +000028import os
29import re
Fred Drake2ef38a71999-02-24 17:33:07 +000030import sys
31
Fred Drake4a473492002-10-30 21:32:40 +000032from xml.sax.saxutils import quoteattr
33
Fred Drake06912b72002-10-16 15:29:07 +000034import buildindex
35import support
36
Fred Drake2ef38a71999-02-24 17:33:07 +000037
Fred Drake01a110b2000-10-05 05:14:26 +000038class IndexOptions(support.Options):
Fred Drakee03e1fe2002-04-05 17:34:50 +000039 aesop_type = "links"
40
Fred Drake01a110b2000-10-05 05:14:26 +000041 def __init__(self):
42 support.Options.__init__(self)
43 self.add_args("l", ["letters"])
44 self.letters = 0
Fred Drake5f7832d1999-03-04 21:19:57 +000045
Fred Drake01a110b2000-10-05 05:14:26 +000046 def handle_option(self, opt, val):
47 if opt in ("-l", "--letters"):
48 self.letters = 1
Fred Drake5f7832d1999-03-04 21:19:57 +000049
Fred Drake01a110b2000-10-05 05:14:26 +000050 def usage(self):
51 program = os.path.basename(sys.argv[0])
52 print __doc__ % {"program": program}
Fred Drake5f7832d1999-03-04 21:19:57 +000053
Fred Drake4a473492002-10-30 21:32:40 +000054 links = [
55 ('author', 'acks.html', 'Acknowledgements'),
56 ('help', 'about.html', 'About the Python Documentation'),
57 ]
58
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)
68
Fred Drake5f7832d1999-03-04 21:19:57 +000069
Fred Drake0a0ef862000-11-28 16:20:50 +000070class Node(buildindex.Node):
Fred Drake9ca78ac2001-06-22 17:11:30 +000071 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
Fred Drake0a0ef862000-11-28 16:20:50 +000076 buildindex.Node.__init__(self, link, self.modname, seqno)
Fred Drake9ca78ac2001-06-22 17:11:30 +000077 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]
Fred Drake0a0ef862000-11-28 16:20:50 +000083
84 def __str__(self):
Fred Drake9ca78ac2001-06-22 17:11:30 +000085 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
Fred Drake0a0ef862000-11-28 16:20:50 +000090
Fred Drake2ef38a71999-02-24 17:33:07 +000091_rx = re.compile(
Fred Drake9ca78ac2001-06-22 17:11:30 +000092 "<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>")
Fred Drake2ef38a71999-02-24 17:33:07 +000095
96def main():
Fred Drake01a110b2000-10-05 05:14:26 +000097 options = IndexOptions()
98 options.variables["title"] = "Global Module Index"
99 options.parse(sys.argv[1:])
100 args = options.args
Fred Drake2ef38a71999-02-24 17:33:07 +0000101 if not args:
102 args = ["-"]
103 #
104 # Collect the input data:
105 #
106 nodes = []
Fred Drake7f492ad1999-03-02 16:22:56 +0000107 has_plat_flag = 0
Fred Drake2ef38a71999-02-24 17:33:07 +0000108 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!
Fred Drake9ca78ac2001-06-22 17:11:30 +0000122 basename, modname, platinfo = m.group(1, 2, 3)
123 has_plat_flag = has_plat_flag or platinfo
Fred Drake2ef38a71999-02-24 17:33:07 +0000124 linkfile = os.path.join(dirname, basename)
Fred Drake9ca78ac2001-06-22 17:11:30 +0000125 nodes.append(Node('<a href="%s">' % linkfile, modname,
126 len(nodes), platinfo))
Fred Drake2ef38a71999-02-24 17:33:07 +0000127 ifp.close()
Fred Drake7f492ad1999-03-02 16:22:56 +0000128 #
129 # Generate all output:
130 #
Fred Drake2ef38a71999-02-24 17:33:07 +0000131 num_nodes = len(nodes)
Fred Drake7f492ad1999-03-02 16:22:56 +0000132 # Here's the HTML generation:
Fred Drake01a110b2000-10-05 05:14:26 +0000133 parts = [options.get_header(),
134 buildindex.process_nodes(nodes, options.columns, options.letters),
135 options.get_footer(),
Fred Drake5f7832d1999-03-04 21:19:57 +0000136 ]
Fred Drake7f492ad1999-03-02 16:22:56 +0000137 if has_plat_flag:
138 parts.insert(1, PLAT_DISCUSS)
Fred Drake06912b72002-10-16 15:29:07 +0000139 html = ''.join(parts)
Fred Drake2ef38a71999-02-24 17:33:07 +0000140 program = os.path.basename(sys.argv[0])
Fred Drake01a110b2000-10-05 05:14:26 +0000141 fp = options.get_output_file()
Fred Drake06912b72002-10-16 15:29:07 +0000142 fp.write(html.rstrip() + "\n")
Fred Drake01a110b2000-10-05 05:14:26 +0000143 if options.outputfile == "-":
Fred Drakeb258bed2001-02-12 15:30:22 +0000144 sys.stderr.write("%s: %d index nodes\n" % (program, num_nodes))
Fred Drake2ef38a71999-02-24 17:33:07 +0000145 else:
Fred Drake2ef38a71999-02-24 17:33:07 +0000146 print
147 print "%s: %d index nodes" % (program, num_nodes)
148
149
Fred Drake7f492ad1999-03-02 16:22:56 +0000150PLAT_DISCUSS = """
151<p> Some module names are followed by an annotation indicating what
152platform they are available on.</p>
153
Fred Drake2ef38a71999-02-24 17:33:07 +0000154"""
155
Fred Drake2ef38a71999-02-24 17:33:07 +0000156
157if __name__ == "__main__":
158 main()