#! /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)">'
    '([a-zA-Z_][a-zA-Z0-9_.]*(\s*<em>\(.*\)</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()
