Widespread: Used classes in a more natural way. Added convenience

methods to squash code duplication.  Simplified several overly complex
chunks of logic.  Built output strings more with string interpolation
instead of infix '+'.  Added comments.  Exploited recent Python features
(chiefly bool and augmented assignment).
This commit is contained in:
Tim Peters 2002-04-20 08:36:42 +00:00
parent 6af3e2dc31
commit e21095e3c5
1 changed files with 74 additions and 61 deletions

View File

@ -17,8 +17,8 @@
import sys import sys
import os import os
import formatter from formatter import NullWriter, AbstractFormatter
import htmllib from htmllib import HTMLParser
import string import string
import getopt import getopt
@ -196,63 +196,87 @@ supported_libraries = {
] ]
} }
class AlmostNullWriter(formatter.NullWriter): # AlmostNullWriter doesn't print anything; it just arranges to save the
savedliteral = '' # 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): def send_flowing_data(self, data):
# need the text tag for later stripped = data.strip()
datastriped = string.strip(data) if stripped: # don't bother to save runs of whitespace
if self.savedliteral == '': self.saved.append(stripped)
self.savedliteral = datastriped
else:
self.savedliteral = string.strip(self.savedliteral +
' ' + datastriped)
# Forget all saved text.
def saved_clear(self):
self.saved = []
class HelpHtmlParser(htmllib.HTMLParser): # Return all saved text as a string.
indent = 0 # number of tabs for pritty printing of files def saved_get(self):
ft = None # output file return ' '.join(self.saved)
path = None # relative path
proc = 0 # if true I process, if false I skip class HelpHtmlParser(HTMLParser):
# (some headers, footers, etc.)
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)
def begin_group(self): def begin_group(self):
if not self.proc: self.indent += 1
# first level, start processing self.proc = True
self.proc = 1
self.indent = self.indent + 1
def finnish_group(self): def finish_group(self):
self.indent = self.indent - 1 self.indent -= 1
if self.proc and self.indent == 0: # stop processing when back to top level
# if processing and back to root, then stop self.proc = self.indent > 0
self.proc = 0
def anchor_bgn(self, href, name, type): def anchor_bgn(self, href, name, type):
if self.proc: if self.proc:
self.formatter.writer.savedliteral = '' self.saved_clear()
self.ft.write('<OBJECT type="text/sitemap">\n') self.write('<OBJECT type="text/sitemap">\n')
self.ft.write('\t' * self.indent + \ self.tab('\t<param name="Local" value="%s/%s">\n' %
'\t<param name="Local" value="' + self.path + \ (self.path, href))
'/' + href + '">\n')
def anchor_end(self): def anchor_end(self):
if self.proc: if self.proc:
self.ft.write('\t' * self.indent + \ self.tab('\t<param name="Name" value="%s">\n' % self.saved_get())
'\t<param name="Name" value="' + \ self.tab('\t</OBJECT>\n')
self.formatter.writer.savedliteral + '">\n')
self.ft.write('\t' * self.indent + '\t</OBJECT>\n')
def start_dl(self, atr_val): def start_dl(self, atr_val):
self.begin_group() self.begin_group()
def end_dl(self): def end_dl(self):
self.finnish_group() self.finish_group()
def do_dt(self, atr_val): def do_dt(self, atr_val):
# no trailing newline on pourpose! # no trailing newline on purpose!
self.ft.write("\t" * self.indent + "<LI>") 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): class IdxHlpHtmlParser(HelpHtmlParser):
# nothing special here, seems enough with parent class # nothing special here, seems enough with parent class
@ -262,47 +286,40 @@ class TocHlpHtmlParser(HelpHtmlParser):
def start_dl(self, atr_val): def start_dl(self, atr_val):
self.begin_group() self.begin_group()
self.ft.write('\t' * self.indent + '<UL>\n') self.tab('<UL>\n')
def end_dl(self): def end_dl(self):
self.finnish_group() self.finish_group()
self.ft.write('</UL>\n') self.tab('</UL>\n')
def start_ul(self, atr_val): def start_ul(self, atr_val):
self.begin_group() self.begin_group()
self.ft.write('\t' * self.indent + '<UL>\n') self.tab('<UL>\n')
def end_ul(self): def end_ul(self):
self.finnish_group() self.finish_group()
self.ft.write('</UL>\n') self.tab('</UL>\n')
def do_li(self, atr_val): def do_li(self, atr_val):
# no trailing newline on pourpose! # no trailing newline on purpose!
self.ft.write("\t" * self.indent + "<LI>") self.tab("<LI>")
def index(path, indexpage, output): def index(path, indexpage, output):
f = formatter.AbstractFormatter(AlmostNullWriter()) parser = IdxHlpHtmlParser(AbstractFormatter(AlmostNullWriter()),
parser = IdxHlpHtmlParser(f) path, output)
parser.path = path
parser.ft = output
f = open(path + '/' + indexpage) f = open(path + '/' + indexpage)
parser.feed(f.read()) parser.feed(f.read())
parser.close() parser.close()
f.close() f.close()
def content(path, contentpage, output): def content(path, contentpage, output):
f = formatter.AbstractFormatter(AlmostNullWriter()) parser = TocHlpHtmlParser(AbstractFormatter(AlmostNullWriter()),
parser = TocHlpHtmlParser(f) path, output)
parser.path = path
parser.ft = output
f = open(path + '/' + contentpage) f = open(path + '/' + contentpage)
parser.feed(f.read()) parser.feed(f.read())
parser.close() parser.close()
f.close() f.close()
def do_index(library, output): def do_index(library, output):
output.write('<UL>\n') output.write('<UL>\n')
for book in library: for book in library:
@ -311,7 +328,6 @@ def do_index(library, output):
index(book.directory, book.indexpage, output) index(book.directory, book.indexpage, output)
output.write('</UL>\n') output.write('</UL>\n')
def do_content(library, version, output): def do_content(library, version, output):
output.write(contents_header % version) output.write(contents_header % version)
for book in library: for book in library:
@ -334,7 +350,6 @@ def do_project(library, output, arch, version):
if page.endswith('.html') or page.endswith('.css'): if page.endswith('.html') or page.endswith('.css'):
output.write(path % page) output.write(path % page)
def openfile(file): def openfile(file):
try: try:
p = open(file, "w") p = open(file, "w")
@ -347,8 +362,6 @@ def usage():
print usage_mode print usage_mode
sys.exit(0) sys.exit(0)
def do_it(args = None): def do_it(args = None):
if not args: if not args:
args = sys.argv[1:] args = sys.argv[1:]