comparison mercurial/templater.py @ 3639:dfbbb33f3fa3

templater: simplify template function
author Matt Mackall <mpm@selenic.com>
date Mon, 13 Nov 2006 13:26:57 -0600
parents 7af1f54c044c
children e7639888bb2f
comparison
equal deleted inserted replaced
3638:7af1f54c044c 3639:dfbbb33f3fa3
94 except IOError, inst: 94 except IOError, inst:
95 raise IOError(inst.args[0], _('template file %s: %s') % 95 raise IOError(inst.args[0], _('template file %s: %s') %
96 (self.map[t], inst.args[1])) 96 (self.map[t], inst.args[1]))
97 return self.template(tmpl, self.filters, **m) 97 return self.template(tmpl, self.filters, **m)
98 98
99 template_re = re.compile(r"[#{]([a-zA-Z_][a-zA-Z0-9_]*)" 99 template_re = re.compile(r"(?:(?:#(?=[\w\|%]+#))|(?:{(?=[\w\|%]+})))"
100 r"((%[a-zA-Z_][a-zA-Z0-9_]*)*)" 100 r"(\w+)((%\w+)*)((\|\w+)*)[#}]")
101 r"((\|[a-zA-Z_][a-zA-Z0-9_]*)*)[#}]")
102 101
103 def template(self, tmpl, filters={}, **map): 102 def template(self, tmpl, filters={}, **map):
104 lm = map.copy()
105 while tmpl: 103 while tmpl:
106 m = self.template_re.search(tmpl) 104 m = self.template_re.search(tmpl)
107 if m: 105 if m:
108 start, end = m.span(0) 106 start, end = m.span(0)
109 s, e = tmpl[start], tmpl[end - 1]
110 key = m.group(1) 107 key = m.group(1)
111 if ((s == '#' and e != '#') or (s == '{' and e != '}')): 108 format = m.group(2)
112 raise SyntaxError(_("'%s'/'%s' mismatch expanding '%s'") % 109 fl = m.group(4)
113 (s, e, key)) 110
114 if start: 111 if start:
115 yield tmpl[:start] 112 yield tmpl[:start]
113
116 v = map.get(key, "") 114 v = map.get(key, "")
117 v = callable(v) and v(**map) or v 115 if callable(v):
118 116 v = v(**map)
119 format = m.group(2)
120 fl = m.group(4)
121 117
122 if format: 118 if format:
123 try: 119 if not hasattr(v, '__iter__'):
124 q = v.__iter__
125 except AttributeError:
126 raise SyntaxError(_("Error expanding '%s%s'") 120 raise SyntaxError(_("Error expanding '%s%s'")
127 % (key, format)) 121 % (key, format))
128 for i in q(): 122 lm = map.copy()
123 for i in v:
129 lm.update(i) 124 lm.update(i)
130 yield self(format[1:], **lm) 125 yield self(format[1:], **lm)
131 126
132 v = "" 127 v = ""
133 128