summaryrefslogtreecommitdiffstats
path: root/Doc/tools/prechm.py
diff options
context:
space:
mode:
Diffstat (limited to 'Doc/tools/prechm.py')
-rw-r--r--Doc/tools/prechm.py519
1 files changed, 0 insertions, 519 deletions
diff --git a/Doc/tools/prechm.py b/Doc/tools/prechm.py
deleted file mode 100644
index b24eea0..0000000
--- a/Doc/tools/prechm.py
+++ /dev/null
@@ -1,519 +0,0 @@
-"""
- 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 <http://alldunn.com/python/>.
-"""
-
-import sys
-import os
-from formatter import NullWriter, AbstractFormatter
-from htmllib import HTMLParser
-import getopt
-import cgi
-
-usage_mode = '''
-Usage: prechm.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).
-# About 0x10384e: This defines the buttons in the help viewer. The
-# following defns are taken from htmlhelp.h. Not all possibilities
-# actually work, and not all those that work are available from the Help
-# Workshop GUI. In particular, the Zoom/Font button works and is not
-# available from the GUI. The ones we're using are marked with 'x':
-#
-# 0x000002 Hide/Show x
-# 0x000004 Back x
-# 0x000008 Forward x
-# 0x000010 Stop
-# 0x000020 Refresh
-# 0x000040 Home x
-# 0x000080 Forward
-# 0x000100 Back
-# 0x000200 Notes
-# 0x000400 Contents
-# 0x000800 Locate x
-# 0x001000 Options x
-# 0x002000 Print x
-# 0x004000 Index
-# 0x008000 Search
-# 0x010000 History
-# 0x020000 Favorites
-# 0x040000 Jump 1
-# 0x080000 Jump 2
-# 0x100000 Zoom/Font x
-# 0x200000 TOC Next
-# 0x400000 TOC Prev
-
-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,0x10384e,[0,0,1024,768],,,,,,,0
-
-[FILES]
-'''
-
-contents_header = '''\
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<HTML>
-<HEAD>
-<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
-<!-- Sitemap 1.0 -->
-</HEAD><BODY>
-<OBJECT type="text/site properties">
- <param name="Window Styles" value="0x801227">
- <param name="ImageType" value="Folder">
-</OBJECT>
-<UL>
-'''
-
-contents_footer = '''\
-</UL></BODY></HTML>
-'''
-
-object_sitemap = '''\
-<OBJECT type="text/sitemap">
- <param name="Name" value="%s">
- <param name="Local" value="%s">
-</OBJECT>
-'''
-
-# 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 no point indexing them even if we wanted to.
-stop_list = '''
-a and are as at
-be but by
-for
-if in into is it
-near no not
-of on or
-such
-that the their then there these they this to
-was will with
-'''
-
-# s is a string or None. If None or empty, return None. Else tack '.html'
-# on to the end, unless it's already there.
-def addhtml(s):
- if s:
- if not s.endswith('.html'):
- s += '.html'
- return s
-
-# Convenience class to hold info about "a book" in HTMLHelp terms == a doc
-# directory in Python terms.
-class Book:
- def __init__(self, directory, title, firstpage,
- contentpage=None, indexpage=None):
- self.directory = directory
- self.title = title
- self.firstpage = addhtml(firstpage)
- self.contentpage = addhtml(contentpage)
- self.indexpage = addhtml(indexpage)
-
-# Library Doc list of books:
-# each 'book' : (Dir, Title, First page, Content page, Index page)
-supported_libraries = {
- '2.5':
- [
- Book('.', 'Main page', 'index'),
- Book('.', 'Global Module Index', 'modindex'),
- Book('whatsnew', "What's New", 'index', 'contents'),
- Book('tut','Tutorial','tut','node2'),
- Book('lib','Library Reference','lib','contents','genindex'),
- Book('ref','Language Reference','ref','contents','genindex'),
- Book('mac','Macintosh Reference','mac','contents','genindex'),
- Book('ext','Extending and Embedding','ext','contents'),
- Book('api','Python/C API','api','contents','genindex'),
- Book('doc','Documenting Python','doc','contents'),
- Book('inst','Installing Python Modules', 'inst', 'index'),
- Book('dist','Distributing Python Modules', 'dist', 'index', 'genindex'),
- ],
-
- '2.4':
- [
- Book('.', 'Main page', 'index'),
- Book('.', 'Global Module Index', 'modindex'),
- Book('whatsnew', "What's New", 'index', 'contents'),
- Book('tut','Tutorial','tut','node2'),
- Book('lib','Library Reference','lib','contents','genindex'),
- Book('ref','Language Reference','ref','contents','genindex'),
- Book('mac','Macintosh Reference','mac','contents','genindex'),
- Book('ext','Extending and Embedding','ext','contents'),
- Book('api','Python/C API','api','contents','genindex'),
- Book('doc','Documenting Python','doc','contents'),
- Book('inst','Installing Python Modules', 'inst', 'index'),
- Book('dist','Distributing Python Modules', 'dist', 'index', 'genindex'),
- ],
-
- '2.3':
- [
- Book('.', 'Main page', 'index'),
- Book('.', 'Global Module Index', 'modindex'),
- Book('whatsnew', "What's New", 'index', 'contents'),
- Book('tut','Tutorial','tut','node2'),
- Book('lib','Library Reference','lib','contents','genindex'),
- Book('ref','Language Reference','ref','contents','genindex'),
- Book('mac','Macintosh Reference','mac','contents','genindex'),
- Book('ext','Extending and Embedding','ext','contents'),
- Book('api','Python/C API','api','contents','genindex'),
- Book('doc','Documenting Python','doc','contents'),
- Book('inst','Installing Python Modules', 'inst', 'index'),
- Book('dist','Distributing Python Modules', 'dist', 'index'),
- ],
-
- '2.2':
- [
- Book('.', 'Main page', 'index'),
- Book('.', 'Global Module Index', 'modindex'),
- Book('whatsnew', "What's New", 'index', 'contents'),
- Book('tut','Tutorial','tut','node2'),
- Book('lib','Library Reference','lib','contents','genindex'),
- Book('ref','Language Reference','ref','contents','genindex'),
- Book('mac','Macintosh Reference','mac','contents','genindex'),
- Book('ext','Extending and Embedding','ext','contents'),
- Book('api','Python/C API','api','contents','genindex'),
- Book('doc','Documenting Python','doc','contents'),
- Book('inst','Installing Python Modules', 'inst', 'index'),
- Book('dist','Distributing Python Modules', 'dist', 'index'),
- ],
-
- '2.1.1':
- [
- Book('.', 'Main page', 'index'),
- Book('.', 'Global Module Index', 'modindex'),
- Book('tut','Tutorial','tut','node2'),
- Book('lib','Library Reference','lib','contents','genindex'),
- Book('ref','Language Reference','ref','contents','genindex'),
- Book('mac','Macintosh Reference','mac','contents','genindex'),
- Book('ext','Extending and Embedding','ext','contents'),
- Book('api','Python/C API','api','contents','genindex'),
- Book('doc','Documenting Python','doc','contents'),
- Book('inst','Installing Python Modules', 'inst', 'index'),
- Book('dist','Distributing Python Modules', 'dist', 'index'),
- ],
-
- '2.0.0':
- [
- Book('.', 'Global Module Index', 'modindex'),
- Book('tut','Tutorial','tut','node2'),
- Book('lib','Library Reference','lib','contents','genindex'),
- Book('ref','Language Reference','ref','contents','genindex'),
- Book('mac','Macintosh Reference','mac','contents','genindex'),
- Book('ext','Extending and Embedding','ext','contents'),
- Book('api','Python/C API','api','contents','genindex'),
- Book('doc','Documenting Python','doc','contents'),
- Book('inst','Installing Python Modules', 'inst', 'contents'),
- Book('dist','Distributing Python Modules', 'dist', 'contents'),
- ],
-
- # <dnagata@creo.com> Apr 17/99: library for 1.5.2 version:
- # <hernan.foffani@iname.com> May 01/99: library for 1.5.2 (04/30/99):
- '1.5.2':
- [
- Book('tut','Tutorial','tut','node2'),
- Book('lib','Library Reference','lib','contents','genindex'),
- Book('ref','Language Reference','ref','contents','genindex'),
- Book('mac','Macintosh Reference','mac','contents','genindex'),
- Book('ext','Extending and Embedding','ext','contents'),
- Book('api','Python/C API','api','contents','genindex'),
- Book('doc','Documenting Python','doc','contents')
- ],
-
- # library for 1.5.1 version:
- '1.5.1':
- [
- Book('tut','Tutorial','tut','contents'),
- Book('lib','Library Reference','lib','contents','genindex'),
- Book('ref','Language Reference','ref-1','ref-2','ref-11'),
- Book('ext','Extending and Embedding','ext','contents'),
- Book('api','Python/C API','api','contents','genindex')
- ],
-
- # library for 1.5 version:
- '1.5':
- [
- Book('tut','Tutorial','tut','node1'),
- Book('lib','Library Reference','lib','node1','node268'),
- Book('ref','Language Reference','ref-1','ref-2','ref-11'),
- Book('ext','Extending and Embedding','ext','node1'),
- Book('api','Python/C API','api','node1','node48')
- ]
-}
-
-# AlmostNullWriter doesn't print anything; it just arranges to save the
-# text sent to send_flowing_data(). This is used to capture the text
-# between an anchor begin/end pair, e.g. for TOC entries.
-
-class AlmostNullWriter(NullWriter):
-
- def __init__(self):
- NullWriter.__init__(self)
- self.saved_clear()
-
- def send_flowing_data(self, data):
- stripped = data.strip()
- if stripped: # don't bother to save runs of whitespace
- self.saved.append(stripped)
-
- # Forget all saved text.
- def saved_clear(self):
- self.saved = []
-
- # Return all saved text as a string.
- def saved_get(self):
- return ' '.join(self.saved)
-
-class HelpHtmlParser(HTMLParser):
-
- def __init__(self, formatter, path, output):
- HTMLParser.__init__(self, formatter)
- self.path = path # relative path
- self.ft = output # output file
- self.indent = 0 # number of tabs for pretty printing of files
- self.proc = False # True when actively processing, else False
- # (headers, footers, etc)
- # XXX This shouldn't need to be a stack -- anchors shouldn't nest.
- # XXX See SF bug <http://www.python.org/sf/546579>.
- self.hrefstack = [] # stack of hrefs from anchor begins
-
- def begin_group(self):
- self.indent += 1
- self.proc = True
-
- def finish_group(self):
- self.indent -= 1
- # stop processing when back to top level
- self.proc = self.indent > 0
-
- def anchor_bgn(self, href, name, type):
- if self.proc:
- # XXX See SF bug <http://www.python.org/sf/546579>.
- # XXX index.html for the 2.2.1 language reference manual contains
- # XXX nested <a></a> tags in the entry for the section on blank
- # XXX lines. We want to ignore the nested part completely.
- if len(self.hrefstack) == 0:
- self.saved_clear()
- self.hrefstack.append(href)
-
- def anchor_end(self):
- if self.proc:
- # XXX See XXX above.
- if self.hrefstack:
- title = cgi.escape(self.saved_get(), True)
- path = self.path + '/' + self.hrefstack.pop()
- self.tab(object_sitemap % (title, path))
-
- def start_dl(self, atr_val):
- self.begin_group()
-
- def end_dl(self):
- self.finish_group()
-
- def do_dt(self, atr_val):
- # no trailing newline on purpose!
- self.tab("<LI>")
-
- # Write text to output file.
- def write(self, text):
- self.ft.write(text)
-
- # Write text to output file after indenting by self.indent tabs.
- def tab(self, text=''):
- self.write('\t' * self.indent)
- if text:
- self.write(text)
-
- # Forget all saved text.
- def saved_clear(self):
- self.formatter.writer.saved_clear()
-
- # Return all saved text as a string.
- def saved_get(self):
- return self.formatter.writer.saved_get()
-
-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.tab('<UL>\n')
-
- def end_dl(self):
- self.finish_group()
- self.tab('</UL>\n')
-
- def start_ul(self, atr_val):
- self.begin_group()
- self.tab('<UL>\n')
-
- def end_ul(self):
- self.finish_group()
- self.tab('</UL>\n')
-
- def do_li(self, atr_val):
- # no trailing newline on purpose!
- self.tab("<LI>")
-
-def index(path, indexpage, output):
- parser = IdxHlpHtmlParser(AbstractFormatter(AlmostNullWriter()),
- path, output)
- f = open(path + '/' + indexpage)
- parser.feed(f.read())
- parser.close()
- f.close()
-
-def content(path, contentpage, output):
- parser = TocHlpHtmlParser(AbstractFormatter(AlmostNullWriter()),
- path, output)
- f = open(path + '/' + contentpage)
- parser.feed(f.read())
- parser.close()
- f.close()
-
-def do_index(library, output):
- output.write('<UL>\n')
- for book in library:
- print('\t', book.title, '-', book.indexpage)
- if book.indexpage:
- index(book.directory, book.indexpage, output)
- output.write('</UL>\n')
-
-def do_content(library, version, output):
- output.write(contents_header)
- for book in library:
- print('\t', book.title, '-', book.firstpage)
- path = book.directory + "/" + book.firstpage
- output.write('<LI>')
- output.write(object_sitemap % (book.title, path))
- if book.contentpage:
- content(book.directory, book.contentpage, 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())
- pathseen = {}
- for book in library:
- directory = book.directory
- path = directory + '\\%s\n'
- for page in os.listdir(directory):
- if page.endswith('.html') or page.endswith('.css'):
- fullpath = path % page
- if fullpath not in pathseen:
- output.write(fullpath)
- pathseen[fullpath] = True
-
-def openfile(file):
- try:
- p = open(file, "w")
- except IOError as 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 as 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(word, file=f)
- 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()