comparison mercurial/hgweb.py @ 135:c0faf50822ea

change template to a generator add write call to output generator
author jake@edge2.net
date Sat, 21 May 2005 20:31:54 -0700
parents 13d609f8d830
children 0e8d60d2bb2b
comparison
equal deleted inserted replaced
134:13d609f8d830 135:c0faf50822ea
23 return ''.join(l) 23 return ''.join(l)
24 24
25 def httphdr(type): 25 def httphdr(type):
26 print 'Content-type: %s\n' % type 26 print 'Content-type: %s\n' % type
27 27
28 def write(*things):
29 for thing in things:
30 if hasattr(thing, "__iter__"):
31 for part in thing:
32 write(part)
33 else:
34 sys.stdout.write(str(thing))
35
28 class template: 36 class template:
29 def __init__(self, tmpl_dir): 37 def __init__(self, tmpl_dir):
30 self.tmpl_dir = tmpl_dir 38 self.tmpl_dir = tmpl_dir
31 def do_page(self, tmpl_fn, **map): 39 def do_page(self, tmpl_fn, **map):
32 out = []
33 txt = file(os.path.join(self.tmpl_dir, tmpl_fn)).read() 40 txt = file(os.path.join(self.tmpl_dir, tmpl_fn)).read()
34 while txt: 41 while txt:
35 m = re.search(r"#([a-zA-Z0-9]+)#", txt) 42 m = re.search(r"#([a-zA-Z0-9]+)#", txt)
36 if m: 43 if m:
37 out.append(txt[:m.start(0)]) 44 yield txt[:m.start(0)]
38 v = map.get(m.group(1), "") 45 v = map.get(m.group(1), "")
39 if callable(v): 46 if callable(v):
40 for y in v(**map): out.append(y) 47 for y in v(**map): yield y
41 else: 48 else:
42 out.append(str(v)) 49 yield v
43 txt = txt[m.end(0):] 50 txt = txt[m.end(0):]
44 else: 51 else:
45 out.append(txt) 52 yield txt
46 txt = '' 53 txt = ''
47 return ''.join(out)
48 54
49 class page: 55 class page:
50 def __init__(self, tmpl_dir = "", type="text/html", title="Mercurial Web", 56 def __init__(self, tmpl_dir = "", type="text/html", title="Mercurial Web",
51 charset="ISO-8859-1"): 57 charset="ISO-8859-1"):
52 self.tmpl = template(tmpl_dir) 58 self.tmpl = template(tmpl_dir)
53 59
54 print 'Content-type: %s; charset=%s\n' % (type, charset) 60 print 'Content-type: %s; charset=%s\n' % (type, charset)
55 print self.tmpl.do_page('htmlstart.tmpl', title = title) 61 write(self.tmpl.do_page('htmlstart.tmpl', title = title))
56 62
57 def endpage(self): 63 def endpage(self):
58 print '</BODY>' 64 print '</BODY>'
59 print '</HTML>' 65 print '</HTML>'
60 66
82 class change_list(page): 88 class change_list(page):
83 def __init__(self, repo, tmpl_dir, reponame, numchanges = 50): 89 def __init__(self, repo, tmpl_dir, reponame, numchanges = 50):
84 page.__init__(self, tmpl_dir) 90 page.__init__(self, tmpl_dir)
85 self.repo = repo 91 self.repo = repo
86 self.numchanges = numchanges 92 self.numchanges = numchanges
87 print self.tmpl.do_page('changestitle.tmpl', reponame=reponame) 93 write(self.tmpl.do_page('changestitle.tmpl', reponame=reponame))
88 94
89 def content(self, hi=None): 95 def content(self, hi=None):
90 cl = [] 96 cl = []
91 count = self.repo.changelog.count() 97 count = self.repo.changelog.count()
92 if not hi: 98 if not hi:
133 datestr = time.asctime(time.gmtime(float(changes[2].split(' ')[0]))) 139 datestr = time.asctime(time.gmtime(float(changes[2].split(' ')[0])))
134 files = [] 140 files = []
135 for f in changes[3]: 141 for f in changes[3]:
136 files.append('<a href="?cmd=file;cs=%s;fn=%s">%s</a>&nbsp;&nbsp;' \ 142 files.append('<a href="?cmd=file;cs=%s;fn=%s">%s</a>&nbsp;&nbsp;' \
137 % (hn, f, cgi.escape(f))) 143 % (hn, f, cgi.escape(f)))
138 print self.tmpl.do_page('change_table.tmpl', 144 write(self.tmpl.do_page('change_table.tmpl',
139 author=obfuscate(changes[1]), 145 author=obfuscate(changes[1]),
140 desc=nl2br(cgi.escape(changes[4])), date=datestr, 146 desc=nl2br(cgi.escape(changes[4])), date=datestr,
141 files=' '.join(files), revnum=i, revnode=hn) 147 files=' '.join(files), revnum=i, revnode=hn))
142 148
143 class checkin(page): 149 class checkin(page):
144 def __init__(self, repo, tmpl_dir, nodestr): 150 def __init__(self, repo, tmpl_dir, nodestr):
145 page.__init__(self, tmpl_dir) 151 page.__init__(self, tmpl_dir)
146 self.repo = repo 152 self.repo = repo
162 % (hg.hex(mf[f]), f, cgi.escape(f))) 168 % (hg.hex(mf[f]), f, cgi.escape(f)))
163 p2link = h2 169 p2link = h2
164 if i2 != -1: 170 if i2 != -1:
165 p2link = '<a href="?cmd=chkin;nd=%s">%s</a>' % (h2, h2) 171 p2link = '<a href="?cmd=chkin;nd=%s">%s</a>' % (h2, h2)
166 172
167 print self.tmpl.do_page('checkin.tmpl', revnum=i, revnode=self.nodestr, 173 write(self.tmpl.do_page('checkin.tmpl', revnum=i, revnode=self.nodestr,
168 p1num=i1, p1node=h1, p2num=i2, p2node=h2, p2link=p2link, 174 p1num=i1, p1node=h1, p2num=i2, p2node=h2, p2link=p2link,
169 mfnum=self.repo.manifest.rev(changes[0]), 175 mfnum=self.repo.manifest.rev(changes[0]),
170 mfnode=hg.hex(changes[0]), author=obfuscate(changes[1]), 176 mfnode=hg.hex(changes[0]), author=obfuscate(changes[1]),
171 desc=nl2br(cgi.escape(changes[4])), date=datestr, 177 desc=nl2br(cgi.escape(changes[4])), date=datestr,
172 files=' '.join(files)) 178 files=' '.join(files)))
173 179
174 (c, a, d) = self.repo.diffrevs(parents[0], self.node) 180 (c, a, d) = self.repo.diffrevs(parents[0], self.node)
175 change = self.repo.changelog.read(parents[0]) 181 change = self.repo.changelog.read(parents[0])
176 mf2 = self.repo.manifest.read(change[0]) 182 mf2 = self.repo.manifest.read(change[0])
177 for f in c: 183 for f in c:
213 219
214 def content(self): 220 def content(self):
215 mf = self.repo.manifest.read(self.node) 221 mf = self.repo.manifest.read(self.node)
216 fns = mf.keys() 222 fns = mf.keys()
217 fns.sort() 223 fns.sort()
218 print self.tmpl.do_page('mftitle.tmpl', node = self.nodestr) 224 write(self.tmpl.do_page('mftitle.tmpl', node = self.nodestr))
219 for f in fns: 225 for f in fns:
220 print self.tmpl.do_page('mfentry.tmpl', fn=f, node=hg.hex(mf[f])) 226 write(self.tmpl.do_page('mfentry.tmpl', fn=f, node=hg.hex(mf[f])))
221 227
222 class histpage(page): 228 class histpage(page):
223 def __init__(self, repo, tmpl_dir, fn): 229 def __init__(self, repo, tmpl_dir, fn):
224 page.__init__(self, tmpl_dir) 230 page.__init__(self, tmpl_dir)
225 self.repo = repo 231 self.repo = repo
248 datestr = time.asctime(time.gmtime(float(changes[2].split(' ')[0]))) 254 datestr = time.asctime(time.gmtime(float(changes[2].split(' ')[0])))
249 p2entry = '' 255 p2entry = ''
250 if i2 != -1: 256 if i2 != -1:
251 p2entry = '&nbsp;&nbsp;%d:<a href="?cmd=file;nd=%s;fn=%s">%s</a>' \ 257 p2entry = '&nbsp;&nbsp;%d:<a href="?cmd=file;nd=%s;fn=%s">%s</a>' \
252 % (i2, h2, self.fn, h2 ), 258 % (i2, h2, self.fn, h2 ),
253 print self.tmpl.do_page('hist_ent.tmpl', author=obfuscate(changes[1]), 259 write(self.tmpl.do_page('hist_ent.tmpl', author=obfuscate(changes[1]),
254 csnode=cs, desc=nl2br(cgi.escape(changes[4])), 260 csnode=cs, desc=nl2br(cgi.escape(changes[4])),
255 date = datestr, fn=self.fn, revnode=h, p1num = i1, 261 date = datestr, fn=self.fn, revnode=h, p1num = i1,
256 p1node=h1, p2entry=p2entry) 262 p1node=h1, p2entry=p2entry))
257 263
258 class hgweb: 264 class hgweb:
259 repo_path = "." 265 repo_path = "."
260 numchanges = 50 266 numchanges = 50
261 tmpl_dir = "templates" 267 tmpl_dir = "templates"