Factor out some of the presentation and shared code from mkmodindex and
a mkackshtml (not yet checked in).
diff --git a/Doc/tools/support.py b/Doc/tools/support.py
new file mode 100644
index 0000000..448abee
--- /dev/null
+++ b/Doc/tools/support.py
@@ -0,0 +1,144 @@
+"""
+"""
+__version__ = '$Revision$'
+
+
+import getopt
+import sys
+
+
+class Options:
+    __short_args = "a:c:ho:"
+    __long_args = [
+        # script controls
+        "columns=", "help", "output=",
+
+        # content components
+        "address=", "iconserver=",
+        "title=", "uplink=", "uptitle="]
+
+    outputfile = "-"
+    columns = 1
+    letters = 0
+    uplink = "./"
+    uptitle = "Python Documentation Index"
+
+    def __init__(self):
+        self.args = []
+        self.variables = {"address": "",
+                          "iconserver": "icons",
+                          "imgtype": "gif",
+                          "title": "Global Module Index",
+                          }
+
+    def add_args(self, short=None, long=None):
+        if short:
+            self.__short_args += short
+        if long:
+            self.__long_args += long
+
+    def parse(self, args):
+        try:
+            opts, args = getopt.getopt(args, self.__short_args,
+                                       self.__long_args)
+        except getopt.error:
+            sys.stdout = sys.stderr
+            self.usage()
+            sys.exit(2)
+        self.args += args
+        for opt, val in opts:
+            if opt in ("-a", "--address"):
+                val = val.strip()
+                if val:
+                    val = "<address>\n%s\n</address>\n" % val
+                    self.variables["address"] = val
+            elif opt in ("-h", "--help"):
+                self.usage()
+                sys.exit()
+            elif opt in ("-o", "--output"):
+                self.outputfile = val
+            elif opt in ("-c", "--columns"):
+                self.columns = int(val)
+            elif opt == "--title":
+                self.variables["title"] = val.strip()
+            elif opt == "--uplink":
+                self.uplink = val.strip()
+            elif opt == "--uptitle":
+                self.uptitle = val.strip()
+            elif opt == "--iconserver":
+                self.variables["iconserver"] = val.strip() or "."
+            else:
+                self.handle_option(opt, val)
+        if self.uplink and self.uptitle:
+            self.variables["uplinkalt"] = "up"
+            self.variables["uplinkicon"] = "up"
+        else:
+            self.variables["uplinkalt"] = ""
+            self.variables["uplinkicon"] = "blank"
+        self.variables["uplink"] = self.uplink
+        self.variables["uptitle"] = self.uptitle
+
+    def handle_option(self, opt, val):
+        raise getopt.error("option %s not recognized" % opt)
+
+    def get_header(self):
+        return HEAD % self.variables
+
+    def get_footer(self):
+        return TAIL % self.variables
+
+    def get_output_file(self, filename=None):
+        if filename is None:
+            filename = self.outputfile
+        if filename == "-":
+            return sys.stdout
+        else:
+            return open(filename, "w")
+
+
+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" width="100%%">%(title)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>
+<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>%(title)s</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>
+''' + NAVIGATION + '''\
+<hr>
+
+<h2>%(title)s</h2>
+
+'''
+
+TAIL = "<hr>\n" + NAVIGATION + '''\
+%(address)s</body>
+</html>
+'''