| #! /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() |