# HG changeset patch # User cmlenz # Date 1160751832 0 # Node ID 3df37819534b743750caca48a805416b2e2fa17f # Parent 689da4ab5082ee254b93c34e10e718e1626cfa72 Ported [364] to 0.3.x branch. diff --git a/genshi/template.py b/genshi/template.py --- a/genshi/template.py +++ b/genshi/template.py @@ -420,7 +420,7 @@
  • 1
  • 2
  • 3
  • """ - __slots__ = ['assign'] + __slots__ = ['assign', 'filename'] ATTRIBUTE = 'each' @@ -432,6 +432,7 @@ assign, value = value.split(' in ', 1) ast = compiler.parse(assign, 'exec') self.assign = _assignment(ast.node.nodes[0].expr) + self.filename = filename Directive.__init__(self, value.strip(), namespaces, filename, lineno, offset) @@ -452,7 +453,7 @@ yield event ctxt.pop() except TypeError, e: - raise TemplateRuntimeError(str(e), *stream[0][2]) + raise TemplateRuntimeError(str(e), self.filename, *stream[0][2][1:]) def __repr__(self): return '<%s>' % self.__class__.__name__ @@ -658,20 +659,26 @@ See the documentation of `py:choose` for usage. """ + __slots__ = ['filename'] ATTRIBUTE = 'test' + def __init__(self, value, namespaces=None, filename=None, lineno=-1, + offset=-1): + Directive.__init__(self, value, namespaces, filename, lineno, offset) + self.filename = filename + def __call__(self, stream, ctxt, directives): matched, frame = ctxt._find('_choose.matched') if not frame: raise TemplateRuntimeError('"when" directives can only be used ' 'inside a "choose" directive', - *stream.next()[2]) + self.filename, *stream.next()[2][1:]) if matched: return [] if not self.expr: raise TemplateRuntimeError('"when" directive has no test condition', - *stream.next()[2]) + self.filename, *stream.next()[2][1:]) value = self.expr.evaluate(ctxt) if '_choose.value' in frame: matched = (value == frame['_choose.value']) @@ -690,12 +697,19 @@ See the documentation of `py:choose` for usage. """ + __slots__ = ['filename'] + + def __init__(self, value, namespaces=None, filename=None, lineno=-1, + offset=-1): + Directive.__init__(self, None, namespaces, filename, lineno, offset) + self.filename = filename + def __call__(self, stream, ctxt, directives): matched, frame = ctxt._find('_choose.matched') if not frame: raise TemplateRuntimeError('an "otherwise" directive can only be ' 'used inside a "choose" directive', - *stream.next()[2]) + self.filename, *stream.next()[2][1:]) if matched: return [] frame['_choose.matched'] = True @@ -811,7 +825,8 @@ _FULL_EXPR_RE = re.compile(r'(? offset: text = source[offset:start] - for kind, data, pos in self._interpolate(text, self.filepath, - lineno, 0): + for kind, data, pos in self._interpolate(text, self.basedir, + self.filename, lineno): stream.append((kind, data, pos)) lineno += len(text.splitlines()) @@ -1227,8 +1247,8 @@ if offset < len(source): text = source[offset:].replace('\\#', '#') - for kind, data, pos in self._interpolate(text, self.filepath, - lineno, 0): + for kind, data, pos in self._interpolate(text, self.basedir, + self.filename, lineno): stream.append((kind, data, pos)) return stream