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:
parent
6af3e2dc31
commit
e21095e3c5
|
@ -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:]
|
||||||
|
|
Loading…
Reference in New Issue