Mercurial > hg
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 |