From 52cfa33e6ee826fcc65e97bb56baf18699996612 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Fri, 19 Apr 2002 16:09:26 +0000 Subject: [PATCH] =?UTF-8?q?Generates=20inputs=20to=20the=20Microsoft=20Hel?= =?UTF-8?q?p=20Compiler,=20which=20creates=20compiled=20HTML=20help=20file?= =?UTF-8?q?s=20(.chm).=20=20Obtained=20from=20Robin=20Dunn's=20packaging?= =?UTF-8?q?=20of=20the=202.2=20docs=20at=20,?= =?UTF-8?q?=20obtained=20in=20turn=20from=20Hern=C3=A1n=20Mart=C3=ADnez=20?= =?UTF-8?q?Foffani's=20original=20work=20at=20.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/tools/prechm.py | 362 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 362 insertions(+) create mode 100644 Doc/tools/prechm.py diff --git a/Doc/tools/prechm.py b/Doc/tools/prechm.py new file mode 100644 index 00000000000..a196e79095b --- /dev/null +++ b/Doc/tools/prechm.py @@ -0,0 +1,362 @@ +''' + 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 + + + +# moved all the triple_quote up here because my syntax-coloring editor +# sucks a little bit. +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. there are seven %s +project_template = ''' +[OPTIONS] +Compatibility=1.1 +Compiled file=%s.chm +Contents file=%s.hhc +Default Window=%s +Default topic=index.html +Display compile progress=No +Full-text search=Yes +Index file=%s.hhk +Language=0x409 +Title=Python %s Documentation + +[WINDOWS] +%s="Python %s Documentation","%s.hhc","%s.hhk","index.html","index.html",\ +,,,,0x2520,220,0x384e,,,,,0,,, + +[FILES] +''' + +contents_header = ''' + + + +
    +
  • + + + +
      +''' + +contents_footer = ''' +
+''' + +object_sitemap = ''' +
  • + + + +''' + +# 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), + ('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 end_dl(self) : + self.finnish_group() + self.ft.write('
    \n') + + def start_ul(self, atr_val) : + self.begin_group() + self.ft.write('\t' * self.indent + '
      \n') + + def end_ul(self) : + self.finnish_group() + self.ft.write('
    \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') + for book in library : + print '\t', book[2] + if book[4] : + index(book[0], book[4], 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) + + +def do_project( library, output, arch, version) : + output.write( project_template % \ + (arch, arch, arch, arch, version, arch, version, arch, arch) ) + for book in library : + for page in os.listdir(book[0]) : + if page[string.rfind(page, '.'):] == '.html' or \ + page[string.rfind(page, '.'):] == '.css': + output.write(book[0]+ '\\' + page + '\n') + + +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) : + 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() + +