Source code for ophelia.pagetemplate

# Copyright (c) 2007-2008 Thomas Lotze
# See also LICENSE.txt

import zope.pagetemplate.pagetemplate


[docs]class PageTemplateTracebackSupplement(object): def __init__(self, template): self.template = template self.source_url = template.file_path self.warnings = template._v_errors
[docs] def getInfo(self): if len(self.template._v_errors) != 2: return fragments = self.template._v_errors[1].rsplit(',')[-2:] if len(fragments) != 2: return try: line = int(fragments[0].split()[-1]) except ValueError: return try: column = int(fragments[1].split()[-1]) except ValueError: return if line >= 5: lower = line - 5 err_line = 5 else: lower = 0 err_line = line line_offset, row_offset = self.template.offset text_lines = self.template._text.rstrip().splitlines()[lower:line + 5] if lower == 0: text_lines[0] = '.' * row_offset + text_lines[0] if line == 1: column += row_offset text_lines = ["%4d: %s" % (lower + i + 1 + line_offset, line) for i, line in enumerate(text_lines)] text_lines.insert(err_line, " -> %s^" % (' ' * column)) return '\n'.join(text_lines)
[docs]class PageTemplate(zope.pagetemplate.pagetemplate.PageTemplate): """Page templates with supplemented tracebacks and source tracking. Call parameters: the namespace of file context variables """ file_path = None def __init__(self, text, file_path=None, offset=(0, 0)): super(PageTemplate, self).__init__() self.file_path = file_path self.offset = offset self.write(text) def _cook(self): __traceback_supplement__ = (PageTemplateTracebackSupplement, self) super(PageTemplate, self)._cook() if self._v_errors: raise ValueError("There were errors in the page template text.")
[docs] def pt_getContext(self, namespaces, names): context = {"None": None, } for namespace in namespaces: context.update(namespace) context.update(names) return context
[docs] def pt_source_file(self): return self.file_path