1 # -*- test-case-name: twisted.lore.test.test_lore -*-
2 # Copyright (c) Twisted Matrix Laboratories.
3 # See LICENSE for details.
7 import tree #todo: get rid of this later
10 class NoProcessorError(Exception):
13 class ProcessingFailure(Exception):
19 return len([1 for el in d.split("/") if el != '.'])
24 def __init__(self, df, fext, linkrel):
26 self.linkrel = linkrel
31 def walkdir(self, topdir, prefix=''):
32 self.basecount = dircount(topdir)
33 os.path.walk(topdir, self.walk, prefix)
35 def walk(self, prefix, d, names):
36 linkrel = prefix + '../' * (dircount(d) - self.basecount)
38 fullpath = os.path.join(d, name)
39 fext = os.path.splitext(name)[1]
41 self.walked.append((linkrel, fullpath))
45 indexer.clearEntries()
47 for linkrel, fullpath in self.walked:
48 linkrel = self.linkrel + linkrel
50 fname = os.path.splitext(fullpath)[0]
51 self.percentdone((float(i) / len(self.walked)), fname)
53 self.df(fullpath, linkrel)
54 except ProcessingFailure, e:
55 self.failures.append((fullpath, e))
56 indexer.generateIndex()
57 self.percentdone(1., None)
59 def percentdone(self, percent, fname):
60 # override for neater progress bars
62 hashes = int(percent * proglen)
63 spaces = proglen - hashes
64 progstat = "[%s%s] (%s)" %('#' * hashes, ' ' * spaces,fname or "*Done*")
65 progstat += (cols - len(progstat)) * ' '
67 sys.stdout.write(progstat)
72 class PlainReportingWalker(Walker):
74 def percentdone(self, percent, fname):
78 class NullReportingWalker(Walker):
80 def percentdone(self, percent, fname):
83 def parallelGenerator(originalFileName, outputExtension):
84 return os.path.splitext(originalFileName)[0]+outputExtension
86 def fooAddingGenerator(originalFileName, outputExtension):
87 return os.path.splitext(originalFileName)[0]+"foo"+outputExtension
89 def outputdirGenerator(originalFileName, outputExtension, inputdir, outputdir):
90 originalFileName = os.path.abspath(originalFileName)
91 abs_inputdir = os.path.abspath(inputdir)
92 if os.path.commonprefix((originalFileName, abs_inputdir)) != abs_inputdir:
93 raise ValueError("Original file name '" + originalFileName +
94 "' not under input directory '" + abs_inputdir + "'")
96 adjustedPath = os.path.join(outputdir, os.path.basename(originalFileName))
97 return tree.getOutputFileName(adjustedPath, outputExtension)
99 def getFilenameGenerator(config, outputExt):
100 if config.get('outputdir'):
101 return (lambda originalFileName, outputExtension:
102 outputdirGenerator(originalFileName, outputExtension,
103 os.path.abspath(config.get('inputdir')),
104 os.path.abspath(config.get('outputdir'))))
106 return tree.getOutputFileName
108 def getProcessor(module, output, config):
110 m = getattr(module.factory, 'generate_'+output)
111 except AttributeError:
112 raise NoProcessorError("cannot generate "+output+" output")
114 if config.get('ext'):
117 from default import htmlDefault
118 ext = htmlDefault['ext']
120 return m(config, getFilenameGenerator(config, ext))