Mercurial > public > mercurial-scm > hg
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> ' \ | 142 files.append('<a href="?cmd=file;cs=%s;fn=%s">%s</a> ' \ |
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 = ' %d:<a href="?cmd=file;nd=%s;fn=%s">%s</a>' \ | 257 p2entry = ' %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" |