cpython/Doc/tools/mkmodindex

214 lines
6.5 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 getopt
import os
import re
import string
import sys
def usage():
program = os.path.basename(sys.argv[0])
print __doc__ % {"program": program}
def error(msg, rc=2):
sys.stdout = sys.stderr
print msg
print
usage()
sys.exit(rc)
_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():
outputfile = "-"
columns = 1
letters = 0
uplink = "./"
uptitle = "Python Documentation Index"
variables = {"address": "",
"iconserver": "icons",
"imgtype": "gif",
"title": "Global Module Index",
"uplinkalt": "up",
"uplinkicon": "up",
}
try:
opts, args = getopt.getopt(sys.argv[1:], "a:c:hlo:",
[# script controls:
"columns=", "help", "letters", "output=",
# content components:
"address=", "iconserver=",
"title=", "uplink=", "uptitle="])
except getopt.error, msg:
error(msg)
for opt, val in opts:
if opt in ("-a", "--address"):
val = string.strip(val)
variables["address"] = val and "<address>\n%s\n</address>\n" % val
elif opt in ("-h", "--help"):
usage()
sys.exit()
elif opt in ("-o", "--output"):
outputfile = val
elif opt in ("-c", "--columns"):
columns = string.atoi(val)
elif opt in ("-l", "--letters"):
letters = 1
elif opt == "--title":
variables["title"] = string.strip(val)
elif opt == "--uplink":
uplink = string.strip(val)
elif opt == "--uptitle":
uptitle = string.strip(val)
elif opt == "--iconserver":
variables["iconserver"] = string.strip(val) or "."
if uplink and uptitle:
variables["uplinkalt"] = "up"
variables["uplinkicon"] = "up"
else:
variables["uplinkalt"] = ""
variables["uplinkicon"] = "blank"
variables["uplink"] = uplink
variables["uptitle"] = uptitle
if not args:
args = ["-"]
#
# Collect the input data:
#
nodes = []
seqno = 0
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 = m.group(1, 2)
has_plat_flag = has_plat_flag or m.group(3)
linkfile = os.path.join(dirname, basename)
nodes.append(buildindex.Node(
'<a href="%s">' % linkfile,
"<tt class=module>%s</tt>" % modname,
seqno))
seqno = seqno + 1
ifp.close()
#
# Generate all output:
#
num_nodes = len(nodes)
# Here's the HTML generation:
parts = [HEAD % variables,
buildindex.process_nodes(nodes, columns, letters),
TAIL % variables,
]
if has_plat_flag:
parts.insert(1, PLAT_DISCUSS)
html = string.join(parts, '')
program = os.path.basename(sys.argv[0])
if outputfile == "-":
sys.stdout.write(html)
sys.stderr.write("%s: %d index nodes\n" % (program, num_nodes))
else:
open(outputfile, "w").write(html)
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>
"""
NAVIGATION = '''\
<div class="navigation">
<table width="100%%" cellpadding="0" cellspacing="2">
<tr>
<td><img width="32" height="32" align="bottom" border="0" alt=""
src="%(iconserver)s/blank.%(imgtype)s"></td>
<td><a href="%(uplink)s"
title="%(uptitle)s"><img width="32" height="32" align="bottom" border="0"
alt="%(uplinkalt)s"
src="%(iconserver)s/%(uplinkicon)s.%(imgtype)s"></a></td>
<td><img width="32" height="32" align="bottom" border="0" alt=""
src="%(iconserver)s/blank.%(imgtype)s"></td>
<td align="center" bgcolor="#99CCFF" width="100%%">
<b class="title">%(title)s</b></td>
<td><img width="32" height="32" align="bottom" border="0" alt=""
src="%(iconserver)s/blank.%(imgtype)s"></td>
<td><img width="32" height="32" align="bottom" border="0" alt=""
src="%(iconserver)s/blank.%(imgtype)s"></td>
<td><img width="32" height="32" align="bottom" border="0" alt=""
src="%(iconserver)s/blank.%(imgtype)s"></td>
</tr></table>
<b class="navlabel">Up:</b> <span class="sectref"><a href="%(uplink)s"
title="%(uptitle)s">%(uptitle)s</A></span>
<br></div>
'''
HEAD = '''\
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Global Module Index</title>
<meta name="description" content="%(title)s">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="STYLESHEET" href="lib/lib.css">
</head>
<body bgcolor=white>
''' + NAVIGATION + '''\
<hr>
<h2>%(title)s</h2>
'''
TAIL = "<hr>\n" + NAVIGATION + '''\
%(address)s</body>
</html>
'''
if __name__ == "__main__":
main()