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

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

import glob, os, sys, string
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[string.lower(base)]=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[string.lower(base)]=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}"""
