Mercurial > genshi > mirror
changeset 298:3df37819534b stable-0.3.x
Ported [364] to 0.3.x branch.
author | cmlenz |
---|---|
date | Fri, 13 Oct 2006 15:03:52 +0000 |
parents | 689da4ab5082 |
children | e3ee88d5113f |
files | genshi/template.py |
diffstat | 1 files changed, 38 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/genshi/template.py +++ b/genshi/template.py @@ -420,7 +420,7 @@ <li>1</li><li>2</li><li>3</li> </ul> """ - __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'(?<!\$)\$\{(.+?)\}', re.DOTALL) _SHORT_EXPR_RE = re.compile(r'(?<!\$)\$([a-zA-Z_][a-zA-Z0-9_\.]*)') - def _interpolate(cls, text, filename=None, lineno=-1, offset=-1): + def _interpolate(cls, text, basedir=None, filename=None, lineno=-1, + offset=0): """Parse the given string and extract expressions. This method returns a list containing both literal text and `Expression` @@ -992,7 +1007,7 @@ ns_prefix = {} depth = 0 - for kind, data, pos in XMLParser(self.source, filename=self.filepath): + for kind, data, pos in XMLParser(self.source, filename=self.filename): if kind is START_NS: # Strip out the namespace declaration for template directives @@ -1015,9 +1030,11 @@ if tag in self.NAMESPACE: cls = self._dir_by_name.get(tag.localname) if cls is None: - raise BadDirectiveError(tag.localname, pos[0], pos[1]) + raise BadDirectiveError(tag.localname, self.filepath, + pos[1]) value = attrib.get(getattr(cls, 'ATTRIBUTE', None), '') - directives.append(cls(value, ns_prefix, *pos)) + directives.append(cls(value, ns_prefix, self.filepath, + pos[1], pos[2])) strip = True new_attrib = [] @@ -1025,12 +1042,14 @@ if name in self.NAMESPACE: cls = self._dir_by_name.get(name.localname) if cls is None: - raise BadDirectiveError(name.localname, pos[0], - pos[1]) - directives.append(cls(value, ns_prefix, *pos)) + raise BadDirectiveError(name.localname, + self.filepath, pos[1]) + directives.append(cls(value, ns_prefix, self.filepath, + pos[1], pos[2])) else: if value: - value = list(self._interpolate(value, *pos)) + value = list(self._interpolate(value, self.basedir, + *pos)) if len(value) == 1 and value[0][0] is TEXT: value = value[0][1] else: @@ -1061,7 +1080,8 @@ pos)] elif kind is TEXT: - for kind, data, pos in self._interpolate(data, *pos): + for kind, data, pos in self._interpolate(data, self.basedir, + *pos): stream.append((kind, data, pos)) elif kind is COMMENT: @@ -1195,8 +1215,8 @@ start, end = mo.span() if start > 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