# Twisted, the Framework of Your Internet
# Copyright (C) 2001 Matthew W. Lefkowitz
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of version 2.1 of the GNU Lesser General Public
# License as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import sys
from twisted.lore import process, default, indexer, numberer, htmlbook
from twisted.python import usage, plugin, reflect
class Options(usage.Options):
optFlags = [["plain", 'p', "Report filenames without progress bar"],
["null", 'n', "Do not report filenames"],
["number", 'N', "Add chapter/section numbers to section headings"],
]
optParameters = [
["input", "i", 'lore'],
["inputext", "e", ".xhtml", "The extension that your Lore input files have"],
["docsdir", "d", None],
["linkrel", "l", ''],
["output", "o", 'html'],
["index", "x", None, "The base filename you want to give your index file"],
["book", "b", None, "The book file to generate a book from"],
]
def __init__(self, *args, **kw):
usage.Options.__init__(self, *args, **kw)
self.config = {}
def opt_config(self, s):
if '=' in s:
k, v = s.split('=', 1)
self.config[k] = v
else:
self.config[s] = 1
def parseArgs(self, *files):
self['files'] = files
def getProcessor(input, output, config):
plugins = plugin.getPlugIns("lore", None, None)
for plug in plugins:
if plug.tapname == input:
module = plug.load()
break
else:
# try treating it as a module name
try:
module = reflect.namedModule(input)
except ImportError:
print '%s: no such input: %s' % (sys.argv[0], input)
return
try:
return process.getProcessor(module, output, config)
except process.NoProcessorError, e:
print "%s: %s" % (sys.argv[0], e)
def getWalker(df, opt):
klass = process.Walker
if opt['plain']:
klass = process.PlainReportingWalker
if opt['null']:
klass = process.NullReportingWalker
return klass(df, opt['inputext'], opt['linkrel'])
def runGivenOptions(opt):
"""Do everything but parse the options; useful for testing.
Returns a descriptive string if there's an error."""
book = None
if opt['book']:
book = htmlbook.Book(opt['book'])
df = getProcessor(opt['input'], opt['output'], opt.config)
if not df:
return 'getProcessor() failed'
walker = getWalker(df, opt)
if opt['files']:
for filename in opt['files']:
walker.walked.append(('', filename))
elif book:
for filename in book.getFiles():
walker.walked.append(('', filename))
else:
walker.walkdir(opt['docsdir'] or '.')
if opt['index']:
indexFilename = opt['index']
elif book:
indexFilename = book.getIndexFilename()
else:
indexFilename = None
if indexFilename:
indexer.setIndexFilename("%s.%s" % (indexFilename, opt['output']))
else:
indexer.setIndexFilename(None)
## TODO: get numberSections from book, if any
numberer.setNumberSections(opt['number'])
walker.generate()
if walker.failures:
for (file, errors) in walker.failures:
for error in errors:
print "%s:%s" % (file, error)
return 'Walker failures'
def run():
opt = Options()
try:
opt.parseOptions()
except usage.UsageError, errortext:
print '%s: %s' % (sys.argv[0], errortext)
print '%s: Try --help for usage details.' % sys.argv[0]
sys.exit(1)
result = runGivenOptions(opt)
if result:
print result
sys.exit(1)
if __name__ == '__main__':
run()
syntax highlighted by Code2HTML, v. 0.9.1