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):