65 tmpl = self.cache[t] |
65 tmpl = self.cache[t] |
66 except KeyError: |
66 except KeyError: |
67 tmpl = self.cache[t] = file(self.map[t]).read() |
67 tmpl = self.cache[t] = file(self.map[t]).read() |
68 return self.template(tmpl, self.filters, **m) |
68 return self.template(tmpl, self.filters, **m) |
69 |
69 |
70 template_re = re.compile(r"#([a-zA-Z_][a-zA-Z0-9_]*)" |
70 template_re = re.compile(r"[#{]([a-zA-Z_][a-zA-Z0-9_]*)" |
71 r"((%[a-zA-Z_][a-zA-Z0-9_]*)*)" |
71 r"((%[a-zA-Z_][a-zA-Z0-9_]*)*)" |
72 r"((\|[a-zA-Z_][a-zA-Z0-9_]*)*)#") |
72 r"((\|[a-zA-Z_][a-zA-Z0-9_]*)*)[#}]") |
73 |
73 |
74 def template(self, tmpl, filters={}, **map): |
74 def template(self, tmpl, filters={}, **map): |
75 lm = map.copy() |
75 lm = map.copy() |
76 while tmpl: |
76 while tmpl: |
77 m = self.template_re.search(tmpl) |
77 m = self.template_re.search(tmpl) |
134 return text.replace('\n', '<br/>\n') |
134 return text.replace('\n', '<br/>\n') |
135 |
135 |
136 def obfuscate(text): |
136 def obfuscate(text): |
137 return ''.join(['&#%d;' % ord(c) for c in text]) |
137 return ''.join(['&#%d;' % ord(c) for c in text]) |
138 |
138 |
|
139 def domain(author): |
|
140 f = author.find('@') |
|
141 if f == -1: return '' |
|
142 author = author[f+1:] |
|
143 f = author.find('>') |
|
144 if f >= 0: author = author[:f] |
|
145 return author |
|
146 |
|
147 def person(author): |
|
148 f = author.find('<') |
|
149 if f == -1: return util.shortuser(author) |
|
150 return author[:f].rstrip() |
|
151 |
139 common_filters = { |
152 common_filters = { |
140 "escape": lambda x: cgi.escape(x, True), |
153 "addbreaks": nl2br, |
141 "urlescape": urllib.quote, |
|
142 "strip": lambda x: x.strip(), |
|
143 "age": age, |
154 "age": age, |
144 "date": lambda x: util.datestr(x), |
155 "date": lambda x: util.datestr(x), |
145 "addbreaks": nl2br, |
156 "escape": lambda x: cgi.escape(x, True), |
|
157 "firstline": (lambda x: x.splitlines(1)[0]), |
|
158 "domain": domain, |
146 "obfuscate": obfuscate, |
159 "obfuscate": obfuscate, |
|
160 "permissions": (lambda x: x and "-rwxr-xr-x" or "-rw-r--r--"), |
|
161 "person": person, |
|
162 "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S"), |
147 "short": (lambda x: x[:12]), |
163 "short": (lambda x: x[:12]), |
148 "firstline": (lambda x: x.splitlines(1)[0]), |
164 "strip": lambda x: x.strip(), |
149 "permissions": (lambda x: x and "-rwxr-xr-x" or "-rw-r--r--"), |
165 "urlescape": urllib.quote, |
150 "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S"), |
166 "user": util.shortuser, |
151 } |
167 } |
152 |
168 |
153 def templatepath(name=None): |
169 def templatepath(name=None): |
154 for f in 'templates', '../templates': |
170 for f in 'templates', '../templates': |
155 fl = f.split('/') |
171 fl = f.split('/') |