blob: 57a43fd6fe03ccbfdda56389f108befe9c863063 [file] [log] [blame]
Tim Peters4f109c12002-04-19 18:41:46 +00001"""
Tim Peters52cfa332002-04-19 16:09:26 +00002 Makes the necesary files to convert from plain html of
3 Python 1.5 and 1.5.x Documentation to
4 Microsoft HTML Help format version 1.1
5 Doesn't change the html's docs.
6
7 by hernan.foffani@iname.com
8 no copyright and no responsabilities.
9
10 modified by Dale Nagata for Python 1.5.2
11
12 Renamed from make_chm.py to prechm.py, and checked into the Python
13 project, 19-Apr-2002 by Tim Peters. Assorted modifications by Tim
14 and Fred Drake. Obtained from Robin Dunn's .chm packaging of the
15 Python 2.2 docs, at <http://alldunn.com/python/>.
Tim Peters4f109c12002-04-19 18:41:46 +000016"""
Tim Peters52cfa332002-04-19 16:09:26 +000017
18import sys
19import os
Tim Peterse21095e2002-04-20 08:36:42 +000020from formatter import NullWriter, AbstractFormatter
21from htmllib import HTMLParser
Tim Peters52cfa332002-04-19 16:09:26 +000022import getopt
Tim Peters45454072002-04-20 20:26:26 +000023import cgi
Tim Peters52cfa332002-04-19 16:09:26 +000024
Tim Peters52cfa332002-04-19 16:09:26 +000025usage_mode = '''
Raymond Hettinger78205542004-02-08 20:05:40 +000026Usage: prechm.py [-c] [-k] [-p] [-v 1.5[.x]] filename
Tim Peters52cfa332002-04-19 16:09:26 +000027 -c: does not build filename.hhc (Table of Contents)
28 -k: does not build filename.hhk (Index)
29 -p: does not build filename.hhp (Project File)
30 -v 1.5[.x]: makes help for the python 1.5[.x] docs
31 (default is python 1.5.2 docs)
32'''
33
Tim Peterse6b63e62002-04-19 18:07:52 +000034# Project file (*.hhp) template. 'arch' is the file basename (like
35# the pythlp in pythlp.hhp); 'version' is the doc version number (like
36# the 2.2 in Python 2.2).
37# The magical numbers in the long line under [WINDOWS] set most of the
38# user-visible features (visible buttons, tabs, etc).
Tim Petersdc374e02002-04-21 02:01:01 +000039# About 0x10384e: This defines the buttons in the help viewer. The
40# following defns are taken from htmlhelp.h. Not all possibilities
41# actually work, and not all those that work are available from the Help
42# Workshop GUI. In particular, the Zoom/Font button works and is not
43# available from the GUI. The ones we're using are marked with 'x':
44#
45# 0x000002 Hide/Show x
46# 0x000004 Back x
47# 0x000008 Forward x
48# 0x000010 Stop
49# 0x000020 Refresh
50# 0x000040 Home x
51# 0x000080 Forward
52# 0x000100 Back
53# 0x000200 Notes
54# 0x000400 Contents
55# 0x000800 Locate x
56# 0x001000 Options x
57# 0x002000 Print x
58# 0x004000 Index
59# 0x008000 Search
60# 0x010000 History
61# 0x020000 Favorites
62# 0x040000 Jump 1
63# 0x080000 Jump 2
64# 0x100000 Zoom/Font x
65# 0x200000 TOC Next
66# 0x400000 TOC Prev
67
Tim Peters52cfa332002-04-19 16:09:26 +000068project_template = '''
69[OPTIONS]
Tim Peterse6b63e62002-04-19 18:07:52 +000070Compiled file=%(arch)s.chm
71Contents file=%(arch)s.hhc
72Default Window=%(arch)s
Tim Peters52cfa332002-04-19 16:09:26 +000073Default topic=index.html
74Display compile progress=No
Tim Peters4f109c12002-04-19 18:41:46 +000075Full text search stop list file=%(arch)s.stp
Tim Peters52cfa332002-04-19 16:09:26 +000076Full-text search=Yes
Tim Peterse6b63e62002-04-19 18:07:52 +000077Index file=%(arch)s.hhk
Tim Peters52cfa332002-04-19 16:09:26 +000078Language=0x409
Tim Peterse6b63e62002-04-19 18:07:52 +000079Title=Python %(version)s Documentation
Tim Peters52cfa332002-04-19 16:09:26 +000080
81[WINDOWS]
Tim Peterse6b63e62002-04-19 18:07:52 +000082%(arch)s="Python %(version)s Documentation","%(arch)s.hhc","%(arch)s.hhk",\
Thomas Hellerccfbfb92003-09-23 20:50:47 +000083"index.html","index.html",,,,,0x63520,220,0x10384e,[0,0,1024,768],,,,,,,0
Tim Peters52cfa332002-04-19 16:09:26 +000084
85[FILES]
86'''
87
Tim Peters45454072002-04-20 20:26:26 +000088contents_header = '''\
89<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
90<HTML>
91<HEAD>
92<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
93<!-- Sitemap 1.0 -->
94</HEAD><BODY>
Tim Peters52cfa332002-04-19 16:09:26 +000095<OBJECT type="text/site properties">
Raymond Hettingerce9b4712004-02-08 19:24:18 +000096 <param name="Window Styles" value="0x801227">
97 <param name="ImageType" value="Folder">
Tim Peters52cfa332002-04-19 16:09:26 +000098</OBJECT>
99<UL>
Tim Peters52cfa332002-04-19 16:09:26 +0000100'''
101
Tim Peters45454072002-04-20 20:26:26 +0000102contents_footer = '''\
Tim Petersc8490c72002-04-20 21:34:34 +0000103</UL></BODY></HTML>
Tim Peters52cfa332002-04-19 16:09:26 +0000104'''
105
Tim Peters45454072002-04-20 20:26:26 +0000106object_sitemap = '''\
107<OBJECT type="text/sitemap">
108 <param name="Name" value="%s">
109 <param name="Local" value="%s">
110</OBJECT>
Tim Peters52cfa332002-04-19 16:09:26 +0000111'''
112
Tim Peters4f109c12002-04-19 18:41:46 +0000113# List of words the full text search facility shouldn't index. This
114# becomes file ARCH.stp. Note that this list must be pretty small!
115# Different versions of the MS docs claim the file has a maximum size of
116# 256 or 512 bytes (including \r\n at the end of each line).
117# Note that "and", "or", "not" and "near" are operators in the search
Tim Peters8d62ad72002-04-20 02:56:20 +0000118# language, so no point indexing them even if we wanted to.
Tim Peters4f109c12002-04-19 18:41:46 +0000119stop_list = '''
Tim Petersa3b0b292002-05-02 21:59:08 +0000120a and are as at
121be but by
122for
123if in into is it
124near no not
125of on or
126such
127that the their then there these they this to
128was will with
Tim Peters4f109c12002-04-19 18:41:46 +0000129'''
130
Tim Petersd9a10502002-04-20 03:25:02 +0000131# s is a string or None. If None or empty, return None. Else tack '.html'
132# on to the end, unless it's already there.
133def addhtml(s):
134 if s:
135 if not s.endswith('.html'):
136 s += '.html'
137 return s
138
139# Convenience class to hold info about "a book" in HTMLHelp terms == a doc
140# directory in Python terms.
141class Book:
142 def __init__(self, directory, title, firstpage,
143 contentpage=None, indexpage=None):
144 self.directory = directory
145 self.title = title
146 self.firstpage = addhtml(firstpage)
147 self.contentpage = addhtml(contentpage)
148 self.indexpage = addhtml(indexpage)
149
150# Library Doc list of books:
Tim Peters661e4922002-04-20 02:39:44 +0000151# each 'book' : (Dir, Title, First page, Content page, Index page)
Tim Peters52cfa332002-04-19 16:09:26 +0000152supported_libraries = {
Martin v. Löwis22f3a6a2006-03-31 16:19:18 +0000153 '2.5':
154 [
155 Book('.', 'Main page', 'index'),
156 Book('.', 'Global Module Index', 'modindex'),
157 Book('whatsnew', "What's New", 'index', 'contents'),
158 Book('tut','Tutorial','tut','node2'),
159 Book('lib','Library Reference','lib','contents','genindex'),
160 Book('ref','Language Reference','ref','contents','genindex'),
161 Book('mac','Macintosh Reference','mac','contents','genindex'),
162 Book('ext','Extending and Embedding','ext','contents'),
163 Book('api','Python/C API','api','contents','genindex'),
164 Book('doc','Documenting Python','doc','contents'),
165 Book('inst','Installing Python Modules', 'inst', 'index'),
166 Book('dist','Distributing Python Modules', 'dist', 'index', 'genindex'),
167 ],
168
Thomas Hellerccfbfb92003-09-23 20:50:47 +0000169 '2.4':
170 [
171 Book('.', 'Main page', 'index'),
172 Book('.', 'Global Module Index', 'modindex'),
173 Book('whatsnew', "What's New", 'index', 'contents'),
174 Book('tut','Tutorial','tut','node2'),
175 Book('lib','Library Reference','lib','contents','genindex'),
176 Book('ref','Language Reference','ref','contents','genindex'),
177 Book('mac','Macintosh Reference','mac','contents','genindex'),
178 Book('ext','Extending and Embedding','ext','contents'),
179 Book('api','Python/C API','api','contents','genindex'),
180 Book('doc','Documenting Python','doc','contents'),
181 Book('inst','Installing Python Modules', 'inst', 'index'),
Thomas Hellera42bc212004-06-18 08:27:36 +0000182 Book('dist','Distributing Python Modules', 'dist', 'index', 'genindex'),
Thomas Hellerccfbfb92003-09-23 20:50:47 +0000183 ],
184
185 '2.3':
186 [
187 Book('.', 'Main page', 'index'),
188 Book('.', 'Global Module Index', 'modindex'),
189 Book('whatsnew', "What's New", 'index', 'contents'),
190 Book('tut','Tutorial','tut','node2'),
191 Book('lib','Library Reference','lib','contents','genindex'),
192 Book('ref','Language Reference','ref','contents','genindex'),
193 Book('mac','Macintosh Reference','mac','contents','genindex'),
194 Book('ext','Extending and Embedding','ext','contents'),
195 Book('api','Python/C API','api','contents','genindex'),
196 Book('doc','Documenting Python','doc','contents'),
197 Book('inst','Installing Python Modules', 'inst', 'index'),
198 Book('dist','Distributing Python Modules', 'dist', 'index'),
199 ],
200
Tim Petersc8490c72002-04-20 21:34:34 +0000201 '2.2':
Tim Peters52cfa332002-04-19 16:09:26 +0000202 [
Tim Petersc8490c72002-04-20 21:34:34 +0000203 Book('.', 'Main page', 'index'),
Tim Petersd9a10502002-04-20 03:25:02 +0000204 Book('.', 'Global Module Index', 'modindex'),
205 Book('whatsnew', "What's New", 'index', 'contents'),
206 Book('tut','Tutorial','tut','node2'),
207 Book('lib','Library Reference','lib','contents','genindex'),
208 Book('ref','Language Reference','ref','contents','genindex'),
209 Book('mac','Macintosh Reference','mac','contents','genindex'),
210 Book('ext','Extending and Embedding','ext','contents'),
211 Book('api','Python/C API','api','contents','genindex'),
212 Book('doc','Documenting Python','doc','contents'),
213 Book('inst','Installing Python Modules', 'inst', 'index'),
214 Book('dist','Distributing Python Modules', 'dist', 'index'),
Tim Peters52cfa332002-04-19 16:09:26 +0000215 ],
216
217 '2.1.1':
218 [
Tim Petersc8490c72002-04-20 21:34:34 +0000219 Book('.', 'Main page', 'index'),
Tim Petersd9a10502002-04-20 03:25:02 +0000220 Book('.', 'Global Module Index', 'modindex'),
221 Book('tut','Tutorial','tut','node2'),
222 Book('lib','Library Reference','lib','contents','genindex'),
223 Book('ref','Language Reference','ref','contents','genindex'),
224 Book('mac','Macintosh Reference','mac','contents','genindex'),
225 Book('ext','Extending and Embedding','ext','contents'),
226 Book('api','Python/C API','api','contents','genindex'),
227 Book('doc','Documenting Python','doc','contents'),
228 Book('inst','Installing Python Modules', 'inst', 'index'),
229 Book('dist','Distributing Python Modules', 'dist', 'index'),
Tim Peters52cfa332002-04-19 16:09:26 +0000230 ],
231
232 '2.0.0':
233 [
Tim Petersd9a10502002-04-20 03:25:02 +0000234 Book('.', 'Global Module Index', 'modindex'),
235 Book('tut','Tutorial','tut','node2'),
236 Book('lib','Library Reference','lib','contents','genindex'),
237 Book('ref','Language Reference','ref','contents','genindex'),
238 Book('mac','Macintosh Reference','mac','contents','genindex'),
239 Book('ext','Extending and Embedding','ext','contents'),
240 Book('api','Python/C API','api','contents','genindex'),
241 Book('doc','Documenting Python','doc','contents'),
242 Book('inst','Installing Python Modules', 'inst', 'contents'),
243 Book('dist','Distributing Python Modules', 'dist', 'contents'),
Tim Peters52cfa332002-04-19 16:09:26 +0000244 ],
245
246 # <dnagata@creo.com> Apr 17/99: library for 1.5.2 version:
247 # <hernan.foffani@iname.com> May 01/99: library for 1.5.2 (04/30/99):
248 '1.5.2':
249 [
Tim Petersd9a10502002-04-20 03:25:02 +0000250 Book('tut','Tutorial','tut','node2'),
251 Book('lib','Library Reference','lib','contents','genindex'),
252 Book('ref','Language Reference','ref','contents','genindex'),
253 Book('mac','Macintosh Reference','mac','contents','genindex'),
254 Book('ext','Extending and Embedding','ext','contents'),
255 Book('api','Python/C API','api','contents','genindex'),
256 Book('doc','Documenting Python','doc','contents')
Tim Peters52cfa332002-04-19 16:09:26 +0000257 ],
258
259 # library for 1.5.1 version:
260 '1.5.1':
261 [
Tim Petersd9a10502002-04-20 03:25:02 +0000262 Book('tut','Tutorial','tut','contents'),
263 Book('lib','Library Reference','lib','contents','genindex'),
264 Book('ref','Language Reference','ref-1','ref-2','ref-11'),
265 Book('ext','Extending and Embedding','ext','contents'),
266 Book('api','Python/C API','api','contents','genindex')
Tim Peters52cfa332002-04-19 16:09:26 +0000267 ],
268
269 # library for 1.5 version:
270 '1.5':
271 [
Tim Petersd9a10502002-04-20 03:25:02 +0000272 Book('tut','Tutorial','tut','node1'),
273 Book('lib','Library Reference','lib','node1','node268'),
274 Book('ref','Language Reference','ref-1','ref-2','ref-11'),
275 Book('ext','Extending and Embedding','ext','node1'),
276 Book('api','Python/C API','api','node1','node48')
Tim Peters52cfa332002-04-19 16:09:26 +0000277 ]
278}
279
Tim Peterse21095e2002-04-20 08:36:42 +0000280# AlmostNullWriter doesn't print anything; it just arranges to save the
281# text sent to send_flowing_data(). This is used to capture the text
282# between an anchor begin/end pair, e.g. for TOC entries.
283
284class AlmostNullWriter(NullWriter):
285
286 def __init__(self):
287 NullWriter.__init__(self)
288 self.saved_clear()
Tim Peters52cfa332002-04-19 16:09:26 +0000289
Tim Peters661e4922002-04-20 02:39:44 +0000290 def send_flowing_data(self, data):
Tim Peterse21095e2002-04-20 08:36:42 +0000291 stripped = data.strip()
292 if stripped: # don't bother to save runs of whitespace
293 self.saved.append(stripped)
Tim Peters52cfa332002-04-19 16:09:26 +0000294
Tim Peterse21095e2002-04-20 08:36:42 +0000295 # Forget all saved text.
296 def saved_clear(self):
297 self.saved = []
Tim Peters52cfa332002-04-19 16:09:26 +0000298
Tim Peterse21095e2002-04-20 08:36:42 +0000299 # Return all saved text as a string.
300 def saved_get(self):
301 return ' '.join(self.saved)
302
303class HelpHtmlParser(HTMLParser):
304
305 def __init__(self, formatter, path, output):
306 HTMLParser.__init__(self, formatter)
307 self.path = path # relative path
308 self.ft = output # output file
309 self.indent = 0 # number of tabs for pretty printing of files
310 self.proc = False # True when actively processing, else False
311 # (headers, footers, etc)
Tim Peters45454072002-04-20 20:26:26 +0000312 # XXX This shouldn't need to be a stack -- anchors shouldn't nest.
313 # XXX See SF bug <http://www.python.org/sf/546579>.
314 self.hrefstack = [] # stack of hrefs from anchor begins
Tim Peters52cfa332002-04-19 16:09:26 +0000315
Tim Peters661e4922002-04-20 02:39:44 +0000316 def begin_group(self):
Tim Peterse21095e2002-04-20 08:36:42 +0000317 self.indent += 1
318 self.proc = True
Tim Peters52cfa332002-04-19 16:09:26 +0000319
Tim Peterse21095e2002-04-20 08:36:42 +0000320 def finish_group(self):
321 self.indent -= 1
322 # stop processing when back to top level
323 self.proc = self.indent > 0
Tim Peters52cfa332002-04-19 16:09:26 +0000324
Tim Peters661e4922002-04-20 02:39:44 +0000325 def anchor_bgn(self, href, name, type):
326 if self.proc:
Tim Peters45454072002-04-20 20:26:26 +0000327 # XXX See SF bug <http://www.python.org/sf/546579>.
Tim Peters4a0db062002-04-21 04:44:11 +0000328 # XXX index.html for the 2.2.1 language reference manual contains
Tim Peters45454072002-04-20 20:26:26 +0000329 # XXX nested <a></a> tags in the entry for the section on blank
330 # XXX lines. We want to ignore the nested part completely.
331 if len(self.hrefstack) == 0:
Tim Peters4a0db062002-04-21 04:44:11 +0000332 self.saved_clear()
333 self.hrefstack.append(href)
334
335 def anchor_end(self):
336 if self.proc:
337 # XXX See XXX above.
338 if self.hrefstack:
339 title = cgi.escape(self.saved_get(), True)
340 path = self.path + '/' + self.hrefstack.pop()
Tim Peters45454072002-04-20 20:26:26 +0000341 self.tab(object_sitemap % (title, path))
Tim Peters52cfa332002-04-19 16:09:26 +0000342
Tim Peters661e4922002-04-20 02:39:44 +0000343 def start_dl(self, atr_val):
Tim Peters52cfa332002-04-19 16:09:26 +0000344 self.begin_group()
345
Tim Peters661e4922002-04-20 02:39:44 +0000346 def end_dl(self):
Tim Peterse21095e2002-04-20 08:36:42 +0000347 self.finish_group()
Tim Peters52cfa332002-04-19 16:09:26 +0000348
Tim Peters661e4922002-04-20 02:39:44 +0000349 def do_dt(self, atr_val):
Tim Peterse21095e2002-04-20 08:36:42 +0000350 # no trailing newline on purpose!
351 self.tab("<LI>")
Tim Peters52cfa332002-04-19 16:09:26 +0000352
Tim Peterse21095e2002-04-20 08:36:42 +0000353 # Write text to output file.
354 def write(self, text):
355 self.ft.write(text)
356
357 # Write text to output file after indenting by self.indent tabs.
358 def tab(self, text=''):
359 self.write('\t' * self.indent)
360 if text:
361 self.write(text)
362
363 # Forget all saved text.
364 def saved_clear(self):
365 self.formatter.writer.saved_clear()
366
367 # Return all saved text as a string.
368 def saved_get(self):
369 return self.formatter.writer.saved_get()
Tim Peters52cfa332002-04-19 16:09:26 +0000370
Tim Peters661e4922002-04-20 02:39:44 +0000371class IdxHlpHtmlParser(HelpHtmlParser):
Tim Peters52cfa332002-04-19 16:09:26 +0000372 # nothing special here, seems enough with parent class
373 pass
374
Tim Peters661e4922002-04-20 02:39:44 +0000375class TocHlpHtmlParser(HelpHtmlParser):
Tim Peters52cfa332002-04-19 16:09:26 +0000376
Tim Peters661e4922002-04-20 02:39:44 +0000377 def start_dl(self, atr_val):
Tim Peters52cfa332002-04-19 16:09:26 +0000378 self.begin_group()
Tim Peterse21095e2002-04-20 08:36:42 +0000379 self.tab('<UL>\n')
Tim Peters52cfa332002-04-19 16:09:26 +0000380
Tim Peters661e4922002-04-20 02:39:44 +0000381 def end_dl(self):
Tim Peterse21095e2002-04-20 08:36:42 +0000382 self.finish_group()
383 self.tab('</UL>\n')
Tim Peters52cfa332002-04-19 16:09:26 +0000384
Tim Peters661e4922002-04-20 02:39:44 +0000385 def start_ul(self, atr_val):
Tim Peters52cfa332002-04-19 16:09:26 +0000386 self.begin_group()
Tim Peterse21095e2002-04-20 08:36:42 +0000387 self.tab('<UL>\n')
Tim Peters52cfa332002-04-19 16:09:26 +0000388
Tim Peters661e4922002-04-20 02:39:44 +0000389 def end_ul(self):
Tim Peterse21095e2002-04-20 08:36:42 +0000390 self.finish_group()
391 self.tab('</UL>\n')
Tim Peters52cfa332002-04-19 16:09:26 +0000392
Tim Peters661e4922002-04-20 02:39:44 +0000393 def do_li(self, atr_val):
Tim Peterse21095e2002-04-20 08:36:42 +0000394 # no trailing newline on purpose!
395 self.tab("<LI>")
Tim Peters52cfa332002-04-19 16:09:26 +0000396
Tim Petersd9a10502002-04-20 03:25:02 +0000397def index(path, indexpage, output):
Tim Peterse21095e2002-04-20 08:36:42 +0000398 parser = IdxHlpHtmlParser(AbstractFormatter(AlmostNullWriter()),
399 path, output)
Tim Petersd9a10502002-04-20 03:25:02 +0000400 f = open(path + '/' + indexpage)
401 parser.feed(f.read())
Tim Peters52cfa332002-04-19 16:09:26 +0000402 parser.close()
Tim Petersd9a10502002-04-20 03:25:02 +0000403 f.close()
Tim Peters52cfa332002-04-19 16:09:26 +0000404
Tim Petersd9a10502002-04-20 03:25:02 +0000405def content(path, contentpage, output):
Tim Peterse21095e2002-04-20 08:36:42 +0000406 parser = TocHlpHtmlParser(AbstractFormatter(AlmostNullWriter()),
407 path, output)
Tim Petersd9a10502002-04-20 03:25:02 +0000408 f = open(path + '/' + contentpage)
409 parser.feed(f.read())
Tim Peters52cfa332002-04-19 16:09:26 +0000410 parser.close()
Tim Petersd9a10502002-04-20 03:25:02 +0000411 f.close()
Tim Peters52cfa332002-04-19 16:09:26 +0000412
Tim Peters661e4922002-04-20 02:39:44 +0000413def do_index(library, output):
Tim Peters52cfa332002-04-19 16:09:26 +0000414 output.write('<UL>\n')
Tim Peters661e4922002-04-20 02:39:44 +0000415 for book in library:
Tim Petersd9a10502002-04-20 03:25:02 +0000416 print '\t', book.title, '-', book.indexpage
417 if book.indexpage:
418 index(book.directory, book.indexpage, output)
Tim Peters52cfa332002-04-19 16:09:26 +0000419 output.write('</UL>\n')
420
Tim Peters661e4922002-04-20 02:39:44 +0000421def do_content(library, version, output):
Tim Petersc8490c72002-04-20 21:34:34 +0000422 output.write(contents_header)
Tim Peters661e4922002-04-20 02:39:44 +0000423 for book in library:
Tim Petersd9a10502002-04-20 03:25:02 +0000424 print '\t', book.title, '-', book.firstpage
Tim Peters45454072002-04-20 20:26:26 +0000425 path = book.directory + "/" + book.firstpage
426 output.write('<LI>')
427 output.write(object_sitemap % (book.title, path))
Tim Petersd9a10502002-04-20 03:25:02 +0000428 if book.contentpage:
429 content(book.directory, book.contentpage, output)
Tim Peters52cfa332002-04-19 16:09:26 +0000430 output.write(contents_footer)
431
Tim Peters460643b2002-04-20 02:37:07 +0000432# Fill in the [FILES] section of the project (.hhp) file.
433# 'library' is the list of directory description tuples from
434# supported_libraries for the version of the docs getting generated.
435def do_project(library, output, arch, version):
Tim Peterse6b63e62002-04-19 18:07:52 +0000436 output.write(project_template % locals())
Tim Petersc8490c72002-04-20 21:34:34 +0000437 pathseen = {}
Tim Peters460643b2002-04-20 02:37:07 +0000438 for book in library:
Tim Petersd9a10502002-04-20 03:25:02 +0000439 directory = book.directory
Tim Peters460643b2002-04-20 02:37:07 +0000440 path = directory + '\\%s\n'
441 for page in os.listdir(directory):
442 if page.endswith('.html') or page.endswith('.css'):
Tim Petersc8490c72002-04-20 21:34:34 +0000443 fullpath = path % page
444 if fullpath not in pathseen:
445 output.write(fullpath)
446 pathseen[fullpath] = True
Tim Peters52cfa332002-04-19 16:09:26 +0000447
Tim Peters661e4922002-04-20 02:39:44 +0000448def openfile(file):
449 try:
Tim Peters52cfa332002-04-19 16:09:26 +0000450 p = open(file, "w")
Tim Peters661e4922002-04-20 02:39:44 +0000451 except IOError, msg:
Tim Peters52cfa332002-04-19 16:09:26 +0000452 print file, ":", msg
453 sys.exit(1)
454 return p
455
Tim Peters661e4922002-04-20 02:39:44 +0000456def usage():
Tim Peters3d7d3722004-07-18 06:25:50 +0000457 print usage_mode
458 sys.exit(0)
Tim Peters52cfa332002-04-19 16:09:26 +0000459
Tim Peters661e4922002-04-20 02:39:44 +0000460def do_it(args = None):
461 if not args:
Tim Peters52cfa332002-04-19 16:09:26 +0000462 args = sys.argv[1:]
463
Tim Peters661e4922002-04-20 02:39:44 +0000464 if not args:
Tim Peters52cfa332002-04-19 16:09:26 +0000465 usage()
466
Tim Peters661e4922002-04-20 02:39:44 +0000467 try:
Tim Peters52cfa332002-04-19 16:09:26 +0000468 optlist, args = getopt.getopt(args, 'ckpv:')
Tim Peters661e4922002-04-20 02:39:44 +0000469 except getopt.error, msg:
Tim Peters52cfa332002-04-19 16:09:26 +0000470 print msg
471 usage()
472
Tim Peters661e4922002-04-20 02:39:44 +0000473 if not args or len(args) > 1:
Tim Peters52cfa332002-04-19 16:09:26 +0000474 usage()
475 arch = args[0]
476
477 version = None
478 for opt in optlist:
479 if opt[0] == '-v':
480 version = opt[1]
481 break
482 if not version:
483 usage()
484
Tim Petersd9a10502002-04-20 03:25:02 +0000485 library = supported_libraries[version]
Tim Peters52cfa332002-04-19 16:09:26 +0000486
Tim Peters661e4922002-04-20 02:39:44 +0000487 if not (('-p','') in optlist):
Tim Peters4f109c12002-04-19 18:41:46 +0000488 fname = arch + '.stp'
489 f = openfile(fname)
490 print "Building stoplist", fname, "..."
491 words = stop_list.split()
492 words.sort()
493 for word in words:
494 print >> f, word
495 f.close()
496
Tim Peters52cfa332002-04-19 16:09:26 +0000497 f = openfile(arch + '.hhp')
498 print "Building Project..."
499 do_project(library, f, arch, version)
500 if version == '2.0.0':
501 for image in os.listdir('icons'):
502 f.write('icons'+ '\\' + image + '\n')
503
504 f.close()
505
Tim Peters661e4922002-04-20 02:39:44 +0000506 if not (('-c','') in optlist):
Tim Peters52cfa332002-04-19 16:09:26 +0000507 f = openfile(arch + '.hhc')
508 print "Building Table of Content..."
509 do_content(library, version, f)
510 f.close()
511
Tim Peters661e4922002-04-20 02:39:44 +0000512 if not (('-k','') in optlist):
Tim Peters52cfa332002-04-19 16:09:26 +0000513 f = openfile(arch + '.hhk')
514 print "Building Index..."
515 do_index(library, f)
516 f.close()
517
Tim Peters661e4922002-04-20 02:39:44 +0000518if __name__ == '__main__':
Tim Peters52cfa332002-04-19 16:09:26 +0000519 do_it()