# Generate custlib.tex, which is a site-specific library document.

# Phase I: list all the things that can be imported

import glob
import os.path
import sys

modules = {}

for modname in sys.builtin_module_names:
    modules[modname] = modname

for dir in sys.path:
    # Look for *.py files
    filelist = glob.glob(os.path.join(dir, '*.py'))
    for file in filelist:
        path, file = os.path.split(file)
        base, ext = os.path.splitext(file)
        modules[base.lower()] = base

    # Look for shared library files
    filelist = (glob.glob(os.path.join(dir, '*.so')) +
                glob.glob(os.path.join(dir, '*.sl')) +
                glob.glob(os.path.join(dir, '*.o')) )
    for file in filelist:
        path, file = os.path.split(file)
        base, ext = os.path.splitext(file)
        if base[-6:] == 'module':
            base = base[:-6]
        modules[base.lower()] = base

# Minor oddity: the types module is documented in libtypes2.tex
if modules.has_key('types'):
    del modules['types']
    modules['types2'] = None

# Phase II: find all documentation files (lib*.tex)
#           and eliminate modules that don't have one.

docs = {}
filelist = glob.glob('lib*.tex')
for file in filelist:
    modname = file[3:-4]
    docs[modname] = modname

mlist = modules.keys()
mlist = filter(lambda x, docs=docs: docs.has_key(x), mlist)
mlist.sort()
mlist = map(lambda x, docs=docs: docs[x], mlist)

modules = mlist

# Phase III: write custlib.tex

# Write the boilerplate
# XXX should be fancied up.
print """\documentstyle[twoside,11pt,myformat]{report}
\\title{Python Library Reference}
\\input{boilerplate}
\\makeindex                     % tell \\index to actually write the .idx file
\\begin{document}
\\pagenumbering{roman}
\\maketitle
\\input{copyright}
\\begin{abstract}
\\noindent This is a customized version of the Python Library Reference.
\\end{abstract}
\\pagebreak
{\\parskip = 0mm \\tableofcontents}
\\pagebreak\\pagenumbering{arabic}"""

for modname in mlist:
    print "\\input{lib%s}" % (modname,)

# Write the end
print """\\input{custlib.ind}                   % Index
\\end{document}"""
