158 lines · 4.7 KB · Text
RawDownload
#! /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 osimport reimport sys from xml.sax.saxutils import quoteattr import buildindeximport support  class IndexOptions(support.Options):    aesop_type = "links"     def __init__(self):        support.Options.__init__(self)        self.add_args("l", ["letters"])        self.letters = 0     def handle_option(self, opt, val):        if opt in ("-l", "--letters"):            self.letters = 1     def usage(self):        program = os.path.basename(sys.argv[0])        print __doc__ % {"program": program}     links = [        ('author', 'acks.html',  'Acknowledgements'),        ('help',   'about.html', 'About the Python Documentation'),        ]     def get_header(self):        header = support.Options.get_header(self)        s = ''        for rel, href, title in self.links:            s += '<link rel="%s" href="%s"' % (rel, href)            if title:                s += ' title=' + quoteattr(title)            s += '>\n  '        return header.replace("<link ", s + "<link ", 1)  class Node(buildindex.Node):    def __init__(self, link, str, seqno, platinfo):        self.annotation = platinfo or None        if str[0][-5:] == "</tt>":            str = str[:-5]        self.modname = str        buildindex.Node.__init__(self, link, self.modname, seqno)        if platinfo:            s = '<tt class="module">%s</tt> %s' \                % (self.modname, self.annotation)        else:            s = '<tt class="module">%s</tt>' % str        self.text = [s]     def __str__(self):        if self.annotation:            return '<tt class="module">%s</tt> %s' \                   % (self.modname, self.annotation)        else:            return '<tt class="module">%s</tt>' % self.modname _rx = re.compile(    "<dt><a href=['\"](module-.*\.html)(?:#l2h-\d+)?['\"]>"    "<tt class=['\"]module['\"]>([a-zA-Z_][a-zA-Z0-9_.]*)</tt>\s*(<em>"    "\(<span class=['\"]platform['\"]>.*</span>\)</em>)?</a>") def main():    options = IndexOptions()    options.variables["title"] = "Global Module Index"    options.parse(sys.argv[1:])    args = options.args    if not args:        args = ["-"]    #    # Collect the input data:    #    nodes = []    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, platinfo = m.group(1, 2, 3)                has_plat_flag = has_plat_flag or platinfo                linkfile = os.path.join(dirname, basename)                nodes.append(Node('<a href="%s">' % linkfile, modname,                                  len(nodes), platinfo))        ifp.close()    #    # Generate all output:    #    num_nodes = len(nodes)    # Here's the HTML generation:    parts = [options.get_header(),             buildindex.process_nodes(nodes, options.columns, options.letters),             options.get_footer(),             ]    if has_plat_flag:        parts.insert(1, PLAT_DISCUSS)    html = ''.join(parts)    program = os.path.basename(sys.argv[0])    fp = options.get_output_file()    fp.write(html.rstrip() + "\n")    if options.outputfile == "-":        sys.stderr.write("%s: %d index nodes\n" % (program, num_nodes))    else:        print        print "%s: %d index nodes" % (program, num_nodes)  PLAT_DISCUSS = """<p> Some module names are followed by an annotation indicating whatplatform they are available on.</p> """  if __name__ == "__main__":    main()