""" Makes the necesary files to convert from plain html of Python 1.5 and 1.5.x Documentation to Microsoft HTML Help format version 1.1 Doesn't change the html's docs. by hernan.foffani@iname.com no copyright and no responsabilities. modified by Dale Nagata for Python 1.5.2 Renamed from make_chm.py to prechm.py, and checked into the Python project, 19-Apr-2002 by Tim Peters. Assorted modifications by Tim and Fred Drake. Obtained from Robin Dunn's .chm packaging of the Python 2.2 docs, at . """ import sys import os import formatter import htmllib import string import getopt usage_mode = ''' Usage: make_chm.py [-c] [-k] [-p] [-v 1.5[.x]] filename -c: does not build filename.hhc (Table of Contents) -k: does not build filename.hhk (Index) -p: does not build filename.hhp (Project File) -v 1.5[.x]: makes help for the python 1.5[.x] docs (default is python 1.5.2 docs) ''' # Project file (*.hhp) template. 'arch' is the file basename (like # the pythlp in pythlp.hhp); 'version' is the doc version number (like # the 2.2 in Python 2.2). # The magical numbers in the long line under [WINDOWS] set most of the # user-visible features (visible buttons, tabs, etc). project_template = ''' [OPTIONS] Compiled file=%(arch)s.chm Contents file=%(arch)s.hhc Default Window=%(arch)s Default topic=index.html Display compile progress=No Full text search stop list file=%(arch)s.stp Full-text search=Yes Index file=%(arch)s.hhk Language=0x409 Title=Python %(version)s Documentation [WINDOWS] %(arch)s="Python %(version)s Documentation","%(arch)s.hhc","%(arch)s.hhk",\ "index.html","index.html",,,,,0x63520,220,0x384e,[271,372,740,718],,,,,,,0 [FILES] ''' contents_header = ''' ''' object_sitemap = '''
  • ''' # List of words the full text search facility shouldn't index. This # becomes file ARCH.stp. Note that this list must be pretty small! # Different versions of the MS docs claim the file has a maximum size of # 256 or 512 bytes (including \r\n at the end of each line). # Note that "and", "or", "not" and "near" are operators in the search # language, so not point indexing them even if wanted to. stop_list = ''' a an and is near not of or the ''' # Library Doc list of tuples: # each 'book' : (Dir, Title, First page, Content page, Index page) # supported_libraries = { '2.2': ### Beta!!! fix for actual release [ ('.', 'Global Module Index', 'modindex.html', None, None), ('whatsnew', "What's New", 'index.html', 'contents.html', None), ('tut','Tutorial','tut.html','node2.html',None), ('lib','Library Reference','lib.html','contents.html','genindex.html'), ('ref','Language Reference','ref.html','contents.html','genindex.html'), ('mac','Macintosh Reference','mac.html','contents.html','genindex.html'), ('ext','Extending and Embedding','ext.html','contents.html',None), ('api','Python/C API','api.html','contents.html','genindex.html'), ('doc','Documenting Python','doc.html','contents.html',None), ('inst','Installing Python Modules', 'inst.html', 'index.html', None), ('dist','Distributing Python Modules', 'dist.html', 'index.html', None), ], '2.1.1': [ ('.', 'Global Module Index', 'modindex.html', None, None), ('tut','Tutorial','tut.html','node2.html',None), ('lib','Library Reference','lib.html','contents.html','genindex.html'), ('ref','Language Reference','ref.html','contents.html','genindex.html'), ('mac','Macintosh Reference','mac.html','contents.html','genindex.html'), ('ext','Extending and Embedding','ext.html','contents.html',None), ('api','Python/C API','api.html','contents.html','genindex.html'), ('doc','Documenting Python','doc.html','contents.html',None), ('inst','Installing Python Modules', 'inst.html', 'index.html', None), ('dist','Distributing Python Modules', 'dist.html', 'index.html', None), ], '2.0.0': [ ('.', 'Global Module Index', 'modindex.html', None, None), ('tut','Tutorial','tut.html','node2.html',None), ('lib','Library Reference','lib.html','contents.html','genindex.html'), ('ref','Language Reference','ref.html','contents.html','genindex.html'), ('mac','Macintosh Reference','mac.html','contents.html','genindex.html'), ('ext','Extending and Embedding','ext.html','contents.html',None), ('api','Python/C API','api.html','contents.html','genindex.html'), ('doc','Documenting Python','doc.html','contents.html',None), ('inst','Installing Python Modules', 'inst.html', 'contents.html', None), ('dist','Distributing Python Modules', 'dist.html', 'contents.html', None), ], # Apr 17/99: library for 1.5.2 version: # May 01/99: library for 1.5.2 (04/30/99): '1.5.2': [ ('tut','Tutorial','tut.html','node2.html',None), ('lib','Library Reference','lib.html','contents.html','genindex.html'), ('ref','Language Reference','ref.html','contents.html','genindex.html'), ('mac','Macintosh Reference','mac.html','contents.html','genindex.html'), ('ext','Extending and Embedding','ext.html','contents.html',None), ('api','Python/C API','api.html','contents.html','genindex.html'), ('doc','Documenting Python','doc.html','contents.html',None) ], # library for 1.5.1 version: '1.5.1': [ ('tut','Tutorial','tut.html','contents.html',None), ('lib','Library Reference','lib.html','contents.html','genindex.html'), ('ref','Language Reference','ref-1.html','ref-2.html','ref-11.html'), ('ext','Extending and Embedding','ext.html','contents.html',None), ('api','Python/C API','api.html','contents.html','genindex.html') ], # library for 1.5 version: '1.5': [ ('tut','Tutorial','tut.html','node1.html',None), ('lib','Library Reference','lib.html','node1.html','node268.html'), ('ref','Language Reference','ref-1.html','ref-2.html','ref-11.html'), ('ext','Extending and Embedding','ext.html','node1.html',None), ('api','Python/C API','api.html','node1.html','node48.html') ] } class AlmostNullWriter(formatter.NullWriter): savedliteral = '' def send_flowing_data(self, data): # need the text tag for later datastriped = string.strip(data) if self.savedliteral == '': self.savedliteral = datastriped else: self.savedliteral = string.strip(self.savedliteral + ' ' + datastriped) class HelpHtmlParser(htmllib.HTMLParser): indent = 0 # number of tabs for pritty printing of files ft = None # output file path = None # relative path proc = 0 # if true I process, if false I skip # (some headers, footers, etc.) def begin_group(self): if not self.proc: # first level, start processing self.proc = 1 self.indent = self.indent + 1 def finnish_group(self): self.indent = self.indent - 1 if self.proc and self.indent == 0: # if processing and back to root, then stop self.proc = 0 def anchor_bgn(self, href, name, type): if self.proc: self.formatter.writer.savedliteral = '' self.ft.write('\n') self.ft.write('\t' * self.indent + \ '\t\n') def anchor_end(self): if self.proc: self.ft.write('\t' * self.indent + \ '\t\n') self.ft.write('\t' * self.indent + '\t\n') def start_dl(self, atr_val): self.begin_group() def end_dl(self): self.finnish_group() def do_dt(self, atr_val): # no trailing newline on pourpose! self.ft.write("\t" * self.indent + "
  • ") class IdxHlpHtmlParser(HelpHtmlParser): # nothing special here, seems enough with parent class pass class TocHlpHtmlParser(HelpHtmlParser): def start_dl(self, atr_val): self.begin_group() self.ft.write('\t' * self.indent + '\n') def start_ul(self, atr_val): self.begin_group() self.ft.write('\t' * self.indent + '\n') def do_li(self, atr_val): # no trailing newline on pourpose! self.ft.write("\t" * self.indent + "
  • ") def index(path, archivo, output): f = formatter.AbstractFormatter(AlmostNullWriter()) parser = IdxHlpHtmlParser(f) parser.path = path parser.ft = output fil = path + '/' + archivo parser.feed(open(fil).read()) parser.close() def content(path, archivo, output): f = formatter.AbstractFormatter(AlmostNullWriter()) parser = TocHlpHtmlParser(f) parser.path = path parser.ft = output fil = path + '/' + archivo parser.feed(open(fil).read()) parser.close() def do_index(library, output): output.write('\n') def do_content(library, version, output): output.write(contents_header % version) for book in library: print '\t', book[2] output.write(object_sitemap % (book[0]+"/"+book[2], book[1])) if book[3]: content(book[0], book[3], output) output.write(contents_footer) # Fill in the [FILES] section of the project (.hhp) file. # 'library' is the list of directory description tuples from # supported_libraries for the version of the docs getting generated. def do_project(library, output, arch, version): output.write(project_template % locals()) for book in library: directory = book[0] path = directory + '\\%s\n' for page in os.listdir(directory): if page.endswith('.html') or page.endswith('.css'): output.write(path % page) def openfile(file): try: p = open(file, "w") except IOError, msg: print file, ":", msg sys.exit(1) return p def usage(): print usage_mode sys.exit(0) def do_it(args = None): if not args: args = sys.argv[1:] if not args: usage() try: optlist, args = getopt.getopt(args, 'ckpv:') except getopt.error, msg: print msg usage() if not args or len(args) > 1: usage() arch = args[0] version = None for opt in optlist: if opt[0] == '-v': version = opt[1] break if not version: usage() library = supported_libraries[ version ] if not (('-p','') in optlist): fname = arch + '.stp' f = openfile(fname) print "Building stoplist", fname, "..." words = stop_list.split() words.sort() for word in words: print >> f, word f.close() f = openfile(arch + '.hhp') print "Building Project..." do_project(library, f, arch, version) if version == '2.0.0': for image in os.listdir('icons'): f.write('icons'+ '\\' + image + '\n') f.close() if not (('-c','') in optlist): f = openfile(arch + '.hhc') print "Building Table of Content..." do_content(library, version, f) f.close() if not (('-k','') in optlist): f = openfile(arch + '.hhk') print "Building Index..." do_index(library, f) f.close() if __name__ == '__main__': do_it()