#! /usr/bin/env python
#  -*- Python -*-

import string
import support
import sys


def collect(fp):
    names = []
    while 1:
        line = fp.readline()
        if not line:
            break
        line = string.strip(line)
        if line:
            names.append(line)
        else:
            names = []
    return names


def main():
    options = support.Options()
    options.columns = 4
    options.variables["title"] = "Acknowledgements"
    options.parse(sys.argv[1:])
    names = collect(sys.stdin)
    percol = (len(names) + options.columns - 1) / options.columns
    colnums = []
    for i in range(options.columns):
        colnums.append(percol*i)
    fp = options.get_output_file()
    fp.write(string.rstrip(options.get_header()) + "\n")
    fp.write(THANKS + "\n")
    fp.write('<table width="100%" align="center">\n')
    for i in range(percol):
        fp.write("  <tr>\n")
        for j in colnums:
            try:
                fp.write("    <td>%s</td>\n" % names[i + j])
            except IndexError:
                pass
        fp.write("  </tr>\n")
    fp.write("</table>\n")
    fp.write(string.rstrip(options.get_footer()) + "\n")
    fp.close()

THANKS = '''\

<p>These people have contributed in some way to the Python
documentation.  This list is probably not complete -- if you feel that
you or anyone else should be on this list, please let us know (send
email to <a
href="mailto:python-docs@python.org">python-docs@python.org</a>), and
we will be glad to correct the problem.</p>

<p>It is only with the input and contributions of the Python community
that Python has such wonderful documentation -- <b>Thank You!</b></p>

'''


if __name__ == "__main__":
    main()
