equal
deleted
inserted
replaced
|
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): |