Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/templater.py @ 1900:f2815605186e
move repeated work out of inner loops.
author | Vadim Gelfer <vadim.gelfer@gmail.com> |
---|---|
date | Mon, 27 Feb 2006 09:15:59 -0800 |
parents | 888d298ddb91 |
children | c64bef3d7043 |
comparison
equal
deleted
inserted
replaced
1899:888d298ddb91 | 1900:f2815605186e |
---|---|
1 import re | |
1 from demandload import demandload | 2 from demandload import demandload |
2 demandload(globals(), "cgi os re time urllib util") | 3 demandload(globals(), "cgi os time urllib util") |
3 | 4 |
4 class templater(object): | 5 class templater(object): |
5 def __init__(self, mapfile, filters={}, defaults={}): | 6 def __init__(self, mapfile, filters={}, defaults={}): |
6 self.cache = {} | 7 self.cache = {} |
7 self.map = {} | 8 self.map = {} |
30 tmpl = self.cache[t] | 31 tmpl = self.cache[t] |
31 except KeyError: | 32 except KeyError: |
32 tmpl = self.cache[t] = file(self.map[t]).read() | 33 tmpl = self.cache[t] = file(self.map[t]).read() |
33 return self.template(tmpl, self.filters, **m) | 34 return self.template(tmpl, self.filters, **m) |
34 | 35 |
36 template_re = re.compile(r"#([a-zA-Z_][a-zA-Z0-9_]*)" | |
37 r"((%[a-zA-Z_][a-zA-Z0-9_]*)*)" | |
38 r"((\|[a-zA-Z_][a-zA-Z0-9_]*)*)#") | |
39 | |
35 def template(self, tmpl, filters={}, **map): | 40 def template(self, tmpl, filters={}, **map): |
41 lm = map.copy() | |
36 while tmpl: | 42 while tmpl: |
37 m = re.search(r"#([a-zA-Z_][a-zA-Z0-9_]*)" | 43 m = self.template_re.search(tmpl) |
38 r"((%[a-zA-Z_][a-zA-Z0-9_]*)*)" | |
39 r"((\|[a-zA-Z_][a-zA-Z0-9_]*)*)#", tmpl) | |
40 if m: | 44 if m: |
41 yield tmpl[:m.start(0)] | 45 start = m.start(0) |
46 if start: | |
47 yield tmpl[:start] | |
42 v = map.get(m.group(1), "") | 48 v = map.get(m.group(1), "") |
43 v = callable(v) and v(**map) or v | 49 v = callable(v) and v(**map) or v |
44 | 50 |
45 format = m.group(2) | 51 format = m.group(2) |
46 fl = m.group(4) | 52 fl = m.group(4) |
47 | 53 |
48 if format: | 54 if format: |
49 q = v.__iter__ | 55 q = v.__iter__ |
50 for i in q(): | 56 for i in q(): |
51 lm = map.copy() | |
52 lm.update(i) | 57 lm.update(i) |
53 yield self(format[1:], **lm) | 58 yield self(format[1:], **lm) |
54 | 59 |
55 v = "" | 60 v = "" |
56 | 61 |
60 | 65 |
61 yield v | 66 yield v |
62 tmpl = tmpl[m.end(0):] | 67 tmpl = tmpl[m.end(0):] |
63 else: | 68 else: |
64 yield tmpl | 69 yield tmpl |
65 return | 70 break |
71 | |
72 agescales = [("second", 1), | |
73 ("minute", 60), | |
74 ("hour", 3600), | |
75 ("day", 3600 * 24), | |
76 ("week", 3600 * 24 * 7), | |
77 ("month", 3600 * 24 * 30), | |
78 ("year", 3600 * 24 * 365)] | |
79 | |
80 agescales.reverse() | |
66 | 81 |
67 def age(x): | 82 def age(x): |
68 def plural(t, c): | 83 def plural(t, c): |
69 if c == 1: | 84 if c == 1: |
70 return t | 85 return t |
74 | 89 |
75 now = time.time() | 90 now = time.time() |
76 then = x[0] | 91 then = x[0] |
77 delta = max(1, int(now - then)) | 92 delta = max(1, int(now - then)) |
78 | 93 |
79 scales = [["second", 1], | 94 for t, s in agescales: |
80 ["minute", 60], | |
81 ["hour", 3600], | |
82 ["day", 3600 * 24], | |
83 ["week", 3600 * 24 * 7], | |
84 ["month", 3600 * 24 * 30], | |
85 ["year", 3600 * 24 * 365]] | |
86 | |
87 scales.reverse() | |
88 | |
89 for t, s in scales: | |
90 n = delta / s | 95 n = delta / s |
91 if n >= 2 or s == 1: | 96 if n >= 2 or s == 1: |
92 return fmt(t, n) | 97 return fmt(t, n) |
93 | 98 |
94 def nl2br(text): | 99 def nl2br(text): |