Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/hgweb/hgweb_mod.py @ 5599:3de66c2a9734
hgweb: split out templater definition
author | Dirkjan Ochtman <dirkjan@ochtman.nl> |
---|---|
date | Mon, 03 Dec 2007 12:40:29 +0100 |
parents | d534ba1c4eb4 |
children | 9d900f7282e6 |
comparison
equal
deleted
inserted
replaced
5598:d534ba1c4eb4 | 5599:3de66c2a9734 |
---|---|
194 ext = spec[2] | 194 ext = spec[2] |
195 if fn.endswith(ext): | 195 if fn.endswith(ext): |
196 req.form['node'] = [fn[:-len(ext)]] | 196 req.form['node'] = [fn[:-len(ext)]] |
197 req.form['type'] = [type_] | 197 req.form['type'] = [type_] |
198 | 198 |
199 # determine scheme, port and server name | 199 # actually process the request |
200 # this is needed to create absolute urls | 200 |
201 | 201 self.templater(req) |
202 proto = req.env.get('wsgi.url_scheme') | |
203 if proto == 'https': | |
204 proto = 'https' | |
205 default_port = "443" | |
206 else: | |
207 proto = 'http' | |
208 default_port = "80" | |
209 | |
210 port = req.env["SERVER_PORT"] | |
211 port = port != default_port and (":" + port) or "" | |
212 urlbase = '%s://%s%s' % (proto, req.env['SERVER_NAME'], port) | |
213 staticurl = self.config("web", "staticurl") or req.url + 'static/' | |
214 if not staticurl.endswith('/'): | |
215 staticurl += '/' | |
216 | |
217 # some functions for the templater | |
218 | |
219 def header(**map): | |
220 header_file = cStringIO.StringIO( | |
221 ''.join(self.t("header", encoding=self.encoding, **map))) | |
222 msg = mimetools.Message(header_file, 0) | |
223 req.header(msg.items()) | |
224 yield header_file.read() | |
225 | |
226 def rawfileheader(**map): | |
227 req.header([('Content-type', map['mimetype']), | |
228 ('Content-disposition', 'filename=%s' % map['file']), | |
229 ('Content-length', str(len(map['raw'])))]) | |
230 yield '' | |
231 | |
232 def footer(**map): | |
233 yield self.t("footer", **map) | |
234 | |
235 def motd(**map): | |
236 yield self.config("web", "motd", "") | |
237 | |
238 def sessionvars(**map): | |
239 fields = [] | |
240 if req.form.has_key('style'): | |
241 style = req.form['style'][0] | |
242 if style != self.config('web', 'style', ''): | |
243 fields.append(('style', style)) | |
244 | |
245 separator = req.url[-1] == '?' and ';' or '?' | |
246 for name, value in fields: | |
247 yield dict(name=name, value=value, separator=separator) | |
248 separator = ';' | |
249 | |
250 style = self.config("web", "style", "") | |
251 if req.form.has_key('style'): | |
252 style = req.form['style'][0] | |
253 mapfile = style_map(self.templatepath, style) | |
254 | |
255 if not self.reponame: | |
256 self.reponame = (self.config("web", "name") | |
257 or req.env.get('REPO_NAME') | |
258 or req.url.strip('/') or self.repo.root) | |
259 | |
260 self.t = templater.templater(mapfile, templater.common_filters, | |
261 defaults={"url": req.url, | |
262 "staticurl": staticurl, | |
263 "urlbase": urlbase, | |
264 "repo": self.reponame, | |
265 "header": header, | |
266 "footer": footer, | |
267 "motd": motd, | |
268 "rawfileheader": rawfileheader, | |
269 "sessionvars": sessionvars | |
270 }) | |
271 | |
272 try: | 202 try: |
273 if not req.form.has_key('cmd'): | 203 if not req.form.has_key('cmd'): |
274 req.form['cmd'] = [self.t.cache['default']] | 204 req.form['cmd'] = [self.t.cache['default']] |
275 | 205 |
276 cmd = req.form['cmd'][0] | 206 cmd = req.form['cmd'][0] |
293 req.respond(400, | 223 req.respond(400, |
294 self.t('error', error='No such method: ' + cmd)) | 224 self.t('error', error='No such method: ' + cmd)) |
295 finally: | 225 finally: |
296 self.t = None | 226 self.t = None |
297 | 227 |
228 def templater(self, req): | |
229 | |
230 # determine scheme, port and server name | |
231 # this is needed to create absolute urls | |
232 | |
233 proto = req.env.get('wsgi.url_scheme') | |
234 if proto == 'https': | |
235 proto = 'https' | |
236 default_port = "443" | |
237 else: | |
238 proto = 'http' | |
239 default_port = "80" | |
240 | |
241 port = req.env["SERVER_PORT"] | |
242 port = port != default_port and (":" + port) or "" | |
243 urlbase = '%s://%s%s' % (proto, req.env['SERVER_NAME'], port) | |
244 staticurl = self.config("web", "staticurl") or req.url + 'static/' | |
245 if not staticurl.endswith('/'): | |
246 staticurl += '/' | |
247 | |
248 # some functions for the templater | |
249 | |
250 def header(**map): | |
251 header_file = cStringIO.StringIO( | |
252 ''.join(self.t("header", encoding=self.encoding, **map))) | |
253 msg = mimetools.Message(header_file, 0) | |
254 req.header(msg.items()) | |
255 yield header_file.read() | |
256 | |
257 def rawfileheader(**map): | |
258 req.header([('Content-type', map['mimetype']), | |
259 ('Content-disposition', 'filename=%s' % map['file']), | |
260 ('Content-length', str(len(map['raw'])))]) | |
261 yield '' | |
262 | |
263 def footer(**map): | |
264 yield self.t("footer", **map) | |
265 | |
266 def motd(**map): | |
267 yield self.config("web", "motd", "") | |
268 | |
269 def sessionvars(**map): | |
270 fields = [] | |
271 if req.form.has_key('style'): | |
272 style = req.form['style'][0] | |
273 if style != self.config('web', 'style', ''): | |
274 fields.append(('style', style)) | |
275 | |
276 separator = req.url[-1] == '?' and ';' or '?' | |
277 for name, value in fields: | |
278 yield dict(name=name, value=value, separator=separator) | |
279 separator = ';' | |
280 | |
281 # figure out which style to use | |
282 | |
283 style = self.config("web", "style", "") | |
284 if req.form.has_key('style'): | |
285 style = req.form['style'][0] | |
286 mapfile = style_map(self.templatepath, style) | |
287 | |
288 if not self.reponame: | |
289 self.reponame = (self.config("web", "name") | |
290 or req.env.get('REPO_NAME') | |
291 or req.url.strip('/') or self.repo.root) | |
292 | |
293 # create the templater | |
294 | |
295 self.t = templater.templater(mapfile, templater.common_filters, | |
296 defaults={"url": req.url, | |
297 "staticurl": staticurl, | |
298 "urlbase": urlbase, | |
299 "repo": self.reponame, | |
300 "header": header, | |
301 "footer": footer, | |
302 "motd": motd, | |
303 "rawfileheader": rawfileheader, | |
304 "sessionvars": sessionvars | |
305 }) | |
306 | |
298 def archivelist(self, nodeid): | 307 def archivelist(self, nodeid): |
299 allowed = self.configlist("web", "allow_archive") | 308 allowed = self.configlist("web", "allow_archive") |
300 for i, spec in self.archive_specs.iteritems(): | 309 for i, spec in self.archive_specs.iteritems(): |
301 if i in allowed or self.configbool("web", "allow" + i): | 310 if i in allowed or self.configbool("web", "allow" + i): |
302 yield {"type" : i, "extension" : spec[2], "node" : nodeid} | 311 yield {"type" : i, "extension" : spec[2], "node" : nodeid} |