From be49adef8c8bf52c3a2db406e6aa954063f1c877 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 4 Jun 2009 18:39:47 +0200 Subject: [PATCH] #158: Allow '..' in template names, and absolute template paths; Jinja 2 by default disables both. --- CHANGES | 3 +++ sphinx/jinja2glue.py | 29 ++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 7bdbbb0f9..72bef47bf 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ Release 0.6.2 (in development) ============================== +* #158: Allow '..' in template names, and absolute template paths; + Jinja 2 by default disables both. + * When highlighting Python code, ignore extra indentation before trying to parse it as Python. diff --git a/sphinx/jinja2glue.py b/sphinx/jinja2glue.py index 679447a81..c584a0cde 100644 --- a/sphinx/jinja2glue.py +++ b/sphinx/jinja2glue.py @@ -15,6 +15,7 @@ from pprint import pformat from jinja2 import FileSystemLoader, BaseLoader, TemplateNotFound, \ contextfunction +from jinja2.utils import open_if_exists from jinja2.sandbox import SandboxedEnvironment from sphinx.util import mtimes_of_files @@ -36,6 +37,32 @@ def accesskey(context, key): return '' +class SphinxFileSystemLoader(FileSystemLoader): + """FileSystemLoader subclass that is not so strict about '..' + entries in template names.""" + + def get_source(self, environment, template): + for searchpath in self.searchpath: + filename = path.join(searchpath, template) + f = open_if_exists(filename) + if f is None: + continue + try: + contents = f.read().decode(self.encoding) + finally: + f.close() + + mtime = path.getmtime(filename) + def uptodate(): + try: + return path.getmtime(filename) == mtime + except OSError: + return False + return contents, filename, uptodate + raise TemplateNotFound(template) + + + class BuiltinTemplateLoader(TemplateBridge, BaseLoader): """ Interfaces the rendering environment of jinja2 for use in Sphinx. @@ -65,7 +92,7 @@ class BuiltinTemplateLoader(TemplateBridge, BaseLoader): self.pathchain = chain # make the paths into loaders - self.loaders = map(FileSystemLoader, chain) + self.loaders = map(SphinxFileSystemLoader, chain) use_i18n = builder.translator is not None extensions = use_i18n and ['jinja2.ext.i18n'] or []