summaryrefslogtreecommitdiff
path: root/sys/src/cmd/python/Doc/tools/prechm.py
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-05-03 11:25:13 +0000
committercinap_lenrek <cinap_lenrek@localhost>2011-05-03 11:25:13 +0000
commit458120dd40db6b4df55a4e96b650e16798ef06a0 (patch)
tree8f82685be24fef97e715c6f5ca4c68d34d5074ee /sys/src/cmd/python/Doc/tools/prechm.py
parent3a742c699f6806c1145aea5149bf15de15a0afd7 (diff)
add hg and python
Diffstat (limited to 'sys/src/cmd/python/Doc/tools/prechm.py')
-rw-r--r--sys/src/cmd/python/Doc/tools/prechm.py519
1 files changed, 519 insertions, 0 deletions
diff --git a/sys/src/cmd/python/Doc/tools/prechm.py b/sys/src/cmd/python/Doc/tools/prechm.py
new file mode 100644
index 000000000..57a43fd6f
--- /dev/null
+++ b/sys/src/cmd/python/Doc/tools/prechm.py
@@ -0,0 +1,519 @@
+"""
+ 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, 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()