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