142 lines
4.2 KiB
Python
Executable File
142 lines
4.2 KiB
Python
Executable File
#! /usr/bin/env python
|
|
# -*- Python -*-
|
|
|
|
"""usage: %(program)s [options] file...
|
|
|
|
Supported options:
|
|
|
|
--address addr
|
|
-a addr Set the address text to include at the end of the generated
|
|
HTML; this should be used for contact information.
|
|
--columns cols
|
|
-c cols Set the number of columns each index section should be
|
|
displayed in. The default is 1.
|
|
--help
|
|
-h Display this help message.
|
|
--letters
|
|
-l Split the output into sections by letter.
|
|
--output file
|
|
-o file Write output to 'file' instead of standard out.
|
|
--iconserver is Use 'is' as the directory containing icons for the
|
|
navigation bar. The default is 'icons'.
|
|
--title str Set the page title to 'str'. The default is 'Global
|
|
Module Index'.
|
|
--uplink url Set the upward link URL. The default is './'.
|
|
--uptitle str Set the upward link title. The default is 'Python
|
|
Documentation Index'.
|
|
"""
|
|
import buildindex
|
|
import os
|
|
import re
|
|
import string
|
|
import support
|
|
import sys
|
|
|
|
|
|
class IndexOptions(support.Options):
|
|
aesop_type = "links"
|
|
|
|
def __init__(self):
|
|
support.Options.__init__(self)
|
|
self.add_args("l", ["letters"])
|
|
self.letters = 0
|
|
|
|
def handle_option(self, opt, val):
|
|
if opt in ("-l", "--letters"):
|
|
self.letters = 1
|
|
|
|
def usage(self):
|
|
program = os.path.basename(sys.argv[0])
|
|
print __doc__ % {"program": program}
|
|
|
|
|
|
class Node(buildindex.Node):
|
|
def __init__(self, link, str, seqno, platinfo):
|
|
self.annotation = platinfo or None
|
|
if str[0][-5:] == "</tt>":
|
|
str = str[:-5]
|
|
self.modname = str
|
|
buildindex.Node.__init__(self, link, self.modname, seqno)
|
|
if platinfo:
|
|
s = '<tt class="module">%s</tt> %s' \
|
|
% (self.modname, self.annotation)
|
|
else:
|
|
s = '<tt class="module">%s</tt>' % str
|
|
self.text = [s]
|
|
|
|
def __str__(self):
|
|
if self.annotation:
|
|
return '<tt class="module">%s</tt> %s' \
|
|
% (self.modname, self.annotation)
|
|
else:
|
|
return '<tt class="module">%s</tt>' % self.modname
|
|
|
|
_rx = re.compile(
|
|
"<dt><a href=['\"](module-.*\.html)(?:#l2h-\d+)?['\"]>"
|
|
"<tt class=['\"]module['\"]>([a-zA-Z_][a-zA-Z0-9_.]*)</tt>\s*(<em>"
|
|
"\(<span class=['\"]platform['\"]>.*</span>\)</em>)?</a>")
|
|
|
|
def main():
|
|
options = IndexOptions()
|
|
options.variables["title"] = "Global Module Index"
|
|
options.parse(sys.argv[1:])
|
|
args = options.args
|
|
if not args:
|
|
args = ["-"]
|
|
#
|
|
# Collect the input data:
|
|
#
|
|
nodes = []
|
|
has_plat_flag = 0
|
|
for ifn in args:
|
|
if ifn == "-":
|
|
ifp = sys.stdin
|
|
dirname = ''
|
|
else:
|
|
ifp = open(ifn)
|
|
dirname = os.path.dirname(ifn)
|
|
while 1:
|
|
line = ifp.readline()
|
|
if not line:
|
|
break
|
|
m = _rx.match(line)
|
|
if m:
|
|
# This line specifies a module!
|
|
basename, modname, platinfo = m.group(1, 2, 3)
|
|
has_plat_flag = has_plat_flag or platinfo
|
|
linkfile = os.path.join(dirname, basename)
|
|
nodes.append(Node('<a href="%s">' % linkfile, modname,
|
|
len(nodes), platinfo))
|
|
ifp.close()
|
|
#
|
|
# Generate all output:
|
|
#
|
|
num_nodes = len(nodes)
|
|
# Here's the HTML generation:
|
|
parts = [options.get_header(),
|
|
buildindex.process_nodes(nodes, options.columns, options.letters),
|
|
options.get_footer(),
|
|
]
|
|
if has_plat_flag:
|
|
parts.insert(1, PLAT_DISCUSS)
|
|
html = string.join(parts, '')
|
|
program = os.path.basename(sys.argv[0])
|
|
fp = options.get_output_file()
|
|
fp.write(string.rstrip(html) + "\n")
|
|
if options.outputfile == "-":
|
|
sys.stderr.write("%s: %d index nodes\n" % (program, num_nodes))
|
|
else:
|
|
print
|
|
print "%s: %d index nodes" % (program, num_nodes)
|
|
|
|
|
|
PLAT_DISCUSS = """
|
|
<p> Some module names are followed by an annotation indicating what
|
|
platform they are available on.</p>
|
|
|
|
"""
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|