File: Synopsis/Formatters/HTML/Views/RawFile.py 1
2
3
4
5
6
7
8
9from Synopsis.Processor import Parameter
10from Synopsis.Formatters.HTML.View import View
11from Synopsis.Formatters.HTML.Tags import *
12from Directory import compile_glob
13
14import time, os, stat, os.path
15
16class RawFile(View):
17 """A module for creating a view for each file with hyperlinked source"""
18
19 src_dir = Parameter('', 'starting point for directory listing')
20 base_path = Parameter('', 'path prefix to strip off of the file names')
21 exclude = Parameter([], 'TODO: define an exclusion mechanism (glob based ?)')
22
23 def register(self, frame):
24
25 super(RawFile, self).register(frame)
26 self._exclude = [compile_glob(e) for e in self.exclude]
27 self.__files = None
28
29 def filename(self):
30
31 return self.__filename
32
33 def title(self):
34
35 return self.__title
36
37 def _get_files(self):
38 """Returns a list of (path, output_filename) for each file."""
39
40 if self.__files is not None: return self.__files
41 self.__files = []
42 dirs = [self.src_dir]
43 while dirs:
44 dir = dirs.pop(0)
45 for entry in os.listdir(os.path.abspath(dir)):
46 exclude = 0
47 for re in self._exclude:
48 if re.match(entry):
49 exclude = 1
50 break
51 if exclude:
52 continue
53 entry_path = os.path.join(dir, entry)
54 info = os.stat(entry_path)
55 if stat.S_ISDIR(info[stat.ST_MODE]):
56 dirs.append(entry_path)
57 else:
58
59 path = entry_path[len(self.base_path):]
60 if path[0] == '/': path = path[1:]
61 filename = self.directory_layout.file_source(path)
62 self.__files.append((entry_path, filename))
63 return self.__files
64
65 def process(self):
66 """Creates a view for every file."""
67
68 for path, filename in self._get_files():
69 self.process_file(path, filename)
70
71 def register_filenames(self):
72
73 for path, filename in self._get_files():
74 self.processor.register_filename(filename, self, path)
75
76 def process_file(self, original, filename):
77 """Creates a view for the given filename."""
78
79
80 reg_view, reg_scope = self.processor.filename_info(filename)
81 if reg_view is not self: return
82
83 self.__filename = filename
84 self.__title = original[len(self.base_path):]
85 self.start_file()
86 self.write_navigation_bar()
87 self.write('File: '+element('b', self.__title))
88 try:
89 lines = open(original, 'rt').readlines()
90 lineno_template = '%%%ds' % len(`len(lines)`)
91 lines = ['<span class="lineno">%s</span><span class="line">%s</span>\n'
92 %(lineno_template % (i + 1), escape(l[:-1]))
93 for i, l in enumerate(lines)]
94 self.write('<pre class="sxr">')
95 self.write(''.join(lines))
96 self.write('</pre>')
97 except:
98 self.write('An error occurred')
99 self.end_file()
100
101
Generated on Thu Apr 16 16:27:14 2009 by
synopsis (version devel)