Edgewall Software

Changeset 364


Ignore:
Timestamp:
Oct 13, 2006, 4:27:15 PM (17 years ago)
Author:
cmlenz
Message:

Some changes to usage of absolute vs. relative template paths to ensure that the filenamed-keyed cache employed by the TemplateLoader doesn't mix up templates with the same name, but from different subdirectories.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/genshi/template.py

    r356 r364  
    426426    </ul>
    427427    """
    428     __slots__ = ['assign']
     428    __slots__ = ['assign', 'filename']
    429429
    430430    ATTRIBUTE = 'each'
     
    438438        ast = compiler.parse(assign, 'exec')
    439439        self.assign = _assignment(ast.node.nodes[0].expr)
     440        self.filename = filename
    440441        Directive.__init__(self, value.strip(), namespaces, filename, lineno,
    441442                           offset)
     
    458459                ctxt.pop()
    459460        except TypeError, e:
    460             raise TemplateRuntimeError(str(e), *stream[0][2])
     461            raise TemplateRuntimeError(str(e), self.filename, *stream[0][2][1:])
    461462
    462463    def __repr__(self):
     
    664665    See the documentation of `py:choose` for usage.
    665666    """
     667    __slots__ = ['filename']
    666668
    667669    ATTRIBUTE = 'test'
     670
     671    def __init__(self, value, namespaces=None, filename=None, lineno=-1,
     672                 offset=-1):
     673        Directive.__init__(self, value, namespaces, filename, lineno, offset)
     674        self.filename = filename
    668675
    669676    def __call__(self, stream, ctxt, directives):
     
    672679            raise TemplateRuntimeError('"when" directives can only be used '
    673680                                       'inside a "choose" directive',
    674                                        *stream.next()[2])
     681                                       self.filename, *stream.next()[2][1:])
    675682        if matched:
    676683            return []
    677684        if not self.expr:
    678685            raise TemplateRuntimeError('"when" directive has no test condition',
    679                                        *stream.next()[2])
     686                                       self.filename, *stream.next()[2][1:])
    680687        value = self.expr.evaluate(ctxt)
    681688        if '_choose.value' in frame:
     
    696703    See the documentation of `py:choose` for usage.
    697704    """
     705    __slots__ = ['filename']
     706
     707    def __init__(self, value, namespaces=None, filename=None, lineno=-1,
     708                 offset=-1):
     709        Directive.__init__(self, None, namespaces, filename, lineno, offset)
     710        self.filename = filename
     711
    698712    def __call__(self, stream, ctxt, directives):
    699713        matched, frame = ctxt._find('_choose.matched')
     
    701715            raise TemplateRuntimeError('an "otherwise" directive can only be '
    702716                                       'used inside a "choose" directive',
    703                                        *stream.next()[2])
     717                                       self.filename, *stream.next()[2][1:])
    704718        if matched:
    705719            return []
     
    817831    _SHORT_EXPR_RE = re.compile(r'(?<!\$)\$([a-zA-Z_][a-zA-Z0-9_\.]*)')
    818832
    819     def _interpolate(cls, text, filename=None, lineno=-1, offset=-1):
     833    def _interpolate(cls, text, basedir=None, filename=None, lineno=-1,
     834                     offset=0):
    820835        """Parse the given string and extract expressions.
    821836       
     
    9981013        depth = 0
    9991014
    1000         for kind, data, pos in XMLParser(self.source, filename=self.filepath):
     1015        for kind, data, pos in XMLParser(self.source, filename=self.filename):
    10011016
    10021017            if kind is START_NS:
     
    10211036                    cls = self._dir_by_name.get(tag.localname)
    10221037                    if cls is None:
    1023                         raise BadDirectiveError(tag.localname, pos[0], pos[1])
     1038                        raise BadDirectiveError(tag.localname, self.filepath,
     1039                                                pos[1])
    10241040                    value = attrib.get(getattr(cls, 'ATTRIBUTE', None), '')
    1025                     directives.append(cls(value, ns_prefix, *pos))
     1041                    directives.append(cls(value, ns_prefix, self.filepath,
     1042                                          pos[1], pos[2]))
    10261043                    strip = True
    10271044
     
    10311048                        cls = self._dir_by_name.get(name.localname)
    10321049                        if cls is None:
    1033                             raise BadDirectiveError(name.localname, pos[0],
    1034                                                     pos[1])
    1035                         directives.append(cls(value, ns_prefix, *pos))
     1050                            raise BadDirectiveError(name.localname,
     1051                                                    self.filepath, pos[1])
     1052                        directives.append(cls(value, ns_prefix, self.filepath,
     1053                                              pos[1], pos[2]))
    10361054                    else:
    10371055                        if value:
    1038                             value = list(self._interpolate(value, *pos))
     1056                            value = list(self._interpolate(value, self.basedir,
     1057                                                           *pos))
    10391058                            if len(value) == 1 and value[0][0] is TEXT:
    10401059                                value = value[0][1]
     
    10671086
    10681087            elif kind is TEXT:
    1069                 for kind, data, pos in self._interpolate(data, *pos):
     1088                for kind, data, pos in self._interpolate(data, self.basedir,
     1089                                                         *pos):
    10701090                    stream.append((kind, data, pos))
    10711091
     
    12011221            if start > offset:
    12021222                text = source[offset:start]
    1203                 for kind, data, pos in self._interpolate(text, self.filepath,
    1204                                                          lineno, 0):
     1223                for kind, data, pos in self._interpolate(text, self.basedir,
     1224                                                         self.filename, lineno):
    12051225                    stream.append((kind, data, pos))
    12061226                lineno += len(text.splitlines())
     
    12331253        if offset < len(source):
    12341254            text = source[offset:].replace('\\#', '#')
    1235             for kind, data, pos in self._interpolate(text, self.filepath,
    1236                                                      lineno, 0):
     1255            for kind, data, pos in self._interpolate(text, self.basedir,
     1256                                                     self.filename, lineno):
    12371257                stream.append((kind, data, pos))
    12381258
Note: See TracChangeset for help on using the changeset viewer.