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