40 {key%format}. |
40 {key%format}. |
41 |
41 |
42 filter uses function to transform value. syntax is |
42 filter uses function to transform value. syntax is |
43 {key|filter1|filter2|...}.''' |
43 {key|filter1|filter2|...}.''' |
44 |
44 |
45 template_re = re.compile(r"(?:(?:#(?=[\w\|%]+#))|(?:{(?=[\w\|%]+})))" |
45 template_re = re.compile(r'{([\w\|%]+)}|#([\w\|%]+)#') |
46 r"(\w+)(?:(?:%(\w+))|((?:\|\w+)*))[#}]") |
|
47 |
46 |
48 def __init__(self, loader, filters={}, defaults={}): |
47 def __init__(self, loader, filters={}, defaults={}): |
49 self.loader = loader |
48 self.loader = loader |
50 self.filters = filters |
49 self.filters = filters |
51 self.defaults = defaults |
50 self.defaults = defaults |
68 elif hasattr(item, '__iter__'): |
67 elif hasattr(item, '__iter__'): |
69 iters.insert(0, iter(item)) |
68 iters.insert(0, iter(item)) |
70 else: |
69 else: |
71 yield str(item) |
70 yield str(item) |
72 |
71 |
73 def _format(self, key, format, get, map): |
72 def _format(self, expr, get, map): |
|
73 key, format = expr.split('%') |
74 v = get(key) |
74 v = get(key) |
75 if not hasattr(v, '__iter__'): |
75 if not hasattr(v, '__iter__'): |
76 raise SyntaxError(_("Error expanding '%s%%%s'") % (key, format)) |
76 raise SyntaxError(_("Error expanding '%s%%%s'") % (key, format)) |
77 lm = map.copy() |
77 lm = map.copy() |
78 for i in v: |
78 for i in v: |
79 lm.update(i) |
79 lm.update(i) |
80 yield self.process(format, lm) |
80 yield self.process(format, lm) |
81 |
81 |
82 def _filter(self, key, filters, get, map): |
82 def _filter(self, expr, get, map): |
83 v = get(key) |
83 parts = expr.split('|') |
84 for f in filters.split('|')[1:]: |
84 v = get(parts[0]) |
|
85 for f in parts[1:]: |
85 v = self.filters[f](v) |
86 v = self.filters[f](v) |
86 return v |
87 return v |
87 |
88 |
88 def _process(self, tmpl, map): |
89 def _process(self, tmpl, map): |
89 '''Render a template. Returns a generator.''' |
90 '''Render a template. Returns a generator.''' |
101 if not m: |
102 if not m: |
102 yield tmpl |
103 yield tmpl |
103 break |
104 break |
104 |
105 |
105 start, end = m.span(0) |
106 start, end = m.span(0) |
106 key, fmt, fl = m.groups() |
107 variants = m.groups() |
|
108 expr = variants[0] or variants[1] |
107 |
109 |
108 if start: |
110 if start: |
109 yield tmpl[:start] |
111 yield tmpl[:start] |
110 tmpl = tmpl[end:] |
112 tmpl = tmpl[end:] |
111 |
113 |
112 if fmt: |
114 if '%' in expr: |
113 yield self._format(key, fmt, get, map) |
115 yield self._format(expr, get, map) |
114 elif fl: |
116 elif '|' in expr: |
115 yield self._filter(key, fl, get, map) |
117 yield self._filter(expr, get, map) |
116 else: |
118 else: |
117 yield get(key) |
119 yield get(expr) |
118 |
120 |
119 engines = {'default': engine} |
121 engines = {'default': engine} |
120 |
122 |
121 class templater(object): |
123 class templater(object): |
122 |
124 |