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>"""
Copyright (C) 2012-2017 Edgewall Software