comparison mercurial/templater.py @ 6783:6d824dc86907

templater: make a template a string-only iterator
author Dirkjan Ochtman <dirkjan@ochtman.nl>
date Sun, 29 Jun 2008 13:16:25 +0200
parents 62e0bb41e682
children 125c8fedcbe0
comparison
equal deleted inserted replaced
6782:b9d6ab187523 6783:6d824dc86907
79 raise SyntaxError(_("%s:%s: parse error") % (mapfile, i)) 79 raise SyntaxError(_("%s:%s: parse error") % (mapfile, i))
80 80
81 def __contains__(self, key): 81 def __contains__(self, key):
82 return key in self.cache or key in self.map 82 return key in self.cache or key in self.map
83 83
84 def __call__(self, t, **map): 84 def _template(self, t):
85 '''perform expansion. 85 '''Get the template for the given template name. Use a local cache.'''
86 t is name of map element to expand.
87 map is added elements to use during expansion.'''
88 if not t in self.cache: 86 if not t in self.cache:
89 try: 87 try:
90 self.cache[t] = file(self.map[t]).read() 88 self.cache[t] = file(self.map[t]).read()
91 except IOError, inst: 89 except IOError, inst:
92 raise IOError(inst.args[0], _('template file %s: %s') % 90 raise IOError(inst.args[0], _('template file %s: %s') %
93 (self.map[t], inst.args[1])) 91 (self.map[t], inst.args[1]))
94 tmpl = self.cache[t] 92 return self.cache[t]
95 93
94 def _process(self, tmpl, map):
95 '''Render a template. Returns a generator.'''
96 while tmpl: 96 while tmpl:
97 m = self.template_re.search(tmpl) 97 m = self.template_re.search(tmpl)
98 if not m: 98 if not m:
99 yield tmpl 99 yield tmpl
100 break 100 break
117 raise SyntaxError(_("Error expanding '%s%%%s'") 117 raise SyntaxError(_("Error expanding '%s%%%s'")
118 % (key, format)) 118 % (key, format))
119 lm = map.copy() 119 lm = map.copy()
120 for i in v: 120 for i in v:
121 lm.update(i) 121 lm.update(i)
122 yield self(format, **lm) 122 t = self._template(format)
123 yield self._process(t, lm)
123 else: 124 else:
124 if fl: 125 if fl:
125 for f in fl.split("|")[1:]: 126 for f in fl.split("|")[1:]:
126 v = self.filters[f](v) 127 v = self.filters[f](v)
127 yield v 128 yield v
129
130 def __call__(self, t, **map):
131 '''Perform expansion. t is name of map element to expand. map contains
132 added elements for use during expansion. Is a generator.'''
133 tmpl = self._template(t)
134 iters = [self._process(tmpl, map)]
135 while iters:
136 try:
137 item = iters[0].next()
138 except StopIteration:
139 iters.pop(0)
140 continue
141 if isinstance(item, str):
142 yield item
143 elif item is None:
144 yield ''
145 elif hasattr(item, '__iter__'):
146 iters.insert(0, iter(item))
147 else:
148 yield str(item)
128 149
129 def templatepath(name=None): 150 def templatepath(name=None):
130 '''return location of template file or directory (if no name). 151 '''return location of template file or directory (if no name).
131 returns None if not found.''' 152 returns None if not found.'''
132 153