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}