# 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 @@
123
"""
- __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