Mercurial > genshi > mirror
comparison genshi/template/inline.py @ 356:cc04c70d1bbd experimental-inline
inline branch: minor tweaks, removed currently unsupported directives
author | cmlenz |
---|---|
date | Wed, 15 Nov 2006 21:47:24 +0000 |
parents | 94639584725a |
children | e9101f20b796 |
comparison
equal
deleted
inserted
replaced
355:94639584725a | 356:cc04c70d1bbd |
---|---|
51 else: | 51 else: |
52 yield TEXT, unicode(obj), pos | 52 yield TEXT, unicode(obj), pos |
53 | 53 |
54 def _expand_text(obj): | 54 def _expand_text(obj): |
55 if obj is not None: | 55 if obj is not None: |
56 # First check for a string, otherwise the iterable test below | |
57 # succeeds, and the string will be chopped up into individual | |
58 # characters | |
59 if isinstance(obj, basestring): | 56 if isinstance(obj, basestring): |
60 yield obj | 57 return [obj] |
61 elif hasattr(obj, '__iter__'): | 58 elif hasattr(obj, '__iter__'): |
62 for event in _ensure(obj): | 59 return [e[1] for e in _ensure(obj) if e[0] is TEXT] |
63 if event[0] is TEXT: | |
64 yield event[1] | |
65 else: | 60 else: |
66 yield unicode(obj) | 61 return [unicode(obj)] |
62 return [] | |
67 | 63 |
68 def _assign(ast): | 64 def _assign(ast): |
69 buf = [] | 65 buf = [] |
70 def _build(node, indices): | 66 def _build(node, indices): |
71 if isinstance(node, (compiler.ast.AssTuple, compiler.ast.Tuple)): | 67 if isinstance(node, (compiler.ast.AssTuple, compiler.ast.Tuple)): |
98 | 94 |
99 sattrs = Attrs([(n, v) for n, v in attrs | 95 sattrs = Attrs([(n, v) for n, v in attrs |
100 if isinstance(v, basestring)]) | 96 if isinstance(v, basestring)]) |
101 for name, val in [(n, v) for n, v in attrs | 97 for name, val in [(n, v) for n, v in attrs |
102 if not isinstance(v, basestring)]: | 98 if not isinstance(v, basestring)]: |
99 if name not in p_qnames: | |
100 qi[0] += 1 | |
101 yield w('Q%d = %r', qi[0], name) | |
102 p_qnames[name] = qi[0] | |
103 for subkind, subdata, subpos in val: | 103 for subkind, subdata, subpos in val: |
104 if subkind is EXPR: | 104 if subkind is EXPR: |
105 if subdata not in p_exprs: | 105 if subdata not in p_exprs: |
106 ei[0] += 1 | 106 ei[0] += 1 |
107 yield w('E%d = %r', ei[0], subdata) | 107 yield w('E%d = %r', ei[0], subdata) |
172 return | 172 return |
173 | 173 |
174 yield w() | 174 yield w() |
175 yield w('# Applying %r', directive) | 175 yield w('# Applying %r', directive) |
176 | 176 |
177 if isinstance(directive, DefDirective): | 177 if isinstance(directive, ForDirective): |
178 pass | |
179 | |
180 elif isinstance(directive, ForDirective): | |
181 ei[0] += 1 | 178 ei[0] += 1 |
182 yield w('for v in E%d.evaluate(ctxt):', p_exprs[directive.expr]) | 179 yield w('for v in E%d.evaluate(ctxt):', p_exprs[directive.expr]) |
183 w.shift() | 180 w.shift() |
184 yield w('ctxt.push(%s)', _assign(directive.target)) | 181 yield w('ctxt.push(%s)', _assign(directive.target)) |
185 for line in _apply(directives, stream): | 182 for line in _apply(directives, stream): |
193 w.shift() | 190 w.shift() |
194 for line in _apply(directives, stream): | 191 for line in _apply(directives, stream): |
195 yield line | 192 yield line |
196 w.unshift() | 193 w.unshift() |
197 | 194 |
198 elif isinstance(directive, WithDirective): | |
199 for targets, expr in directive.vars: | |
200 ei[0] += 1 | |
201 yield w('v = E%d.evaluate(ctxt)', p_exprs[directive.expr]) | |
202 for node, _ in targets: | |
203 yield w('ctxt.push(%s)', _assign(node)) | |
204 for line in _apply(directives, stream): | |
205 yield line | |
206 yield w('ctxt.pop()') | |
207 | |
208 elif isinstance(directive, StripDirective): | |
209 yield w('if E%d.evaluate(ctxt):', p_exprs[directive.expr]) | |
210 w.shift() | |
211 lines = _apply(directives, stream) | |
212 previous = lines.next() | |
213 for line in lines: | |
214 yield previous | |
215 previous = line | |
216 w.unshift() | |
217 yield w('else:') | |
218 w.shift() | |
219 for line in _apply(directives, stream): | |
220 yield line | |
221 w.unshift() | |
222 | |
223 else: | 195 else: |
224 raise NotImplementedError | 196 raise NotImplementedError |
225 | 197 |
226 yield w() | 198 yield w() |
227 | 199 |
239 | 211 |
240 sattrs = Attrs([(n, v) for n, v in attrs | 212 sattrs = Attrs([(n, v) for n, v in attrs |
241 if isinstance(v, basestring)]) | 213 if isinstance(v, basestring)]) |
242 at = p_attrs[tuple(sattrs)] | 214 at = p_attrs[tuple(sattrs)] |
243 if filter(None, [not isinstance(v, basestring) for n,v in attrs]): | 215 if filter(None, [not isinstance(v, basestring) for n,v in attrs]): |
244 yield w('a = []') | 216 yield w('a = [(an, "".join(av)) for an, av in ([') |
217 w.shift() | |
245 for name, value in [(n, v) for n, v in attrs | 218 for name, value in [(n, v) for n, v in attrs |
246 if not isinstance(v, basestring)]: | 219 if not isinstance(v, basestring)]: |
247 parts = [] | 220 values = [] |
248 for subkind, subdata, subpos in value: | 221 for subkind, subdata, subpos in value: |
249 if subkind is EXPR: | 222 if subkind is EXPR: |
250 parts.append('list(_expand_text(E%d.evaluate(ctxt)))' % | 223 values.append('_expand_text(E%d.evaluate(ctxt))' % |
251 p_exprs[subdata]) | 224 p_exprs[subdata]) |
252 elif subkind is TEXT: | 225 elif subkind is TEXT: |
253 parts.append('[%r]' % subdata) | 226 values.append('[%r]' % subdata) |
254 yield w('v = [v for v in %s if v is not None]', | 227 yield w('(Q%d, [v for v in %s if v is not None]),' % ( |
255 ' + '.join(parts)) | 228 p_qnames[name], ' + '.join(values) |
256 yield w('if v:') | 229 )) |
257 w.shift() | 230 w.unshift() |
258 yield w('a.append((%r, "".join(v)))', name) | 231 yield w(']) if av]') |
259 w.unshift() | |
260 yield w('yield START, (Q%d, A%d | a), (f, %d, %d)', qn, at, | 232 yield w('yield START, (Q%d, A%d | a), (f, %d, %d)', qn, at, |
261 *pos[1:]) | 233 *pos[1:]) |
262 else: | 234 else: |
263 yield w('yield START, (Q%d, A%d), (f, %d, %d)', qn, at, *pos[1:]) | 235 yield w('yield START, (Q%d, A%d), (f, %d, %d)', qn, at, *pos[1:]) |
264 | 236 |
317 <h1 py:def="sayhi(name='world')" py:strip=""> | 289 <h1 py:def="sayhi(name='world')" py:strip=""> |
318 Hello, $name! | 290 Hello, $name! |
319 </h1> | 291 </h1> |
320 ${sayhi()} | 292 ${sayhi()} |
321 <ul py:if="items"> | 293 <ul py:if="items"> |
322 <li py:for="idx, item in enumerate(items)"> | 294 <li py:for="idx, item in enumerate(items)" |
295 class="${idx % 2 and 'odd' or 'even'}"> | |
323 <span py:replace="item + 1">NUM</span> | 296 <span py:replace="item + 1">NUM</span> |
324 </li> | 297 </li> |
325 </ul> | 298 </ul> |
326 </body> | 299 </body> |
327 </html>""" | 300 </html>""" |