diff --git a/babel.cfg b/babel.cfg index 5f5188b18..e53a462d3 100644 --- a/babel.cfg +++ b/babel.cfg @@ -1,6 +1,4 @@ -[extractors] -jinja = sphinx._jinja.babel_extract [python: **.py] -[jinja: **/templates/**.html] -[jinja: **/templates/**.xml] +[jinja2: **/templates/**.html] +[jinja2: **/templates/**.xml] [javascript: **.js] diff --git a/setup.py b/setup.py index abe82198d..ba80ea239 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +0;115;0c# -*- coding: utf-8 -*- import ez_setup ez_setup.use_setuptools() @@ -36,7 +36,7 @@ are already present, work fine and can be seen "in action" in the Python docs: and inclusion of appropriately formatted docstrings. ''' -requires = ['Pygments>=0.8', 'Jinja>=1.1', 'docutils>=0.4'] +requires = ['Pygments>=0.8', 'Jinja2>=2.0', 'docutils>=0.4'] if sys.version_info < (2, 4): print 'ERROR: Sphinx requires at least Python 2.4 to run.' diff --git a/sphinx/_jinja2.py b/sphinx/_jinja2.py new file mode 100644 index 000000000..a6f23e280 --- /dev/null +++ b/sphinx/_jinja2.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- + +""" + sphinx._jinja2 + ============== + + Glue code for jinja2. + + :author: Sebastian Wiesner + :contact: basti.wiesner@gmx.net + :copyright: 2008 by Sebastian Wiesner + :license: MIT +""" + +import codecs +from os import path + +import jinja2 + +from sphinx.util import mtimes_of_files +from sphinx.application import TemplateBridge + + +class SphinxLoader(jinja2.BaseLoader): + """ + A jinja2 reimplementation of `sphinx._jinja.SphinxFileSystemLoader`. + """ + + def __init__(self, basepath, extpaths, encoding='utf-8'): + """ + Creates a new loader for sphinx. + + ``extpaths`` is a list of directories, which provide additional + templates to sphinx. + + ``encoding`` is used to decode the templates into unicode strings. + Defaults to utf-8. + + If ``basepath`` is set, this path is used to load sphinx core + templates. If False, these templates are loaded from the sphinx + package. + """ + self.core_loader = jinja2.FileSystemLoader(basepath) + self.all_loaders = jinja2.ChoiceLoader( + [jinja2.FileSystemLoader(extpath) for extpath in extpaths] + + [self.core_loader]) + + def get_source(self, environment, template): + # exclamation mark forces loading from core + if template.startswith('!'): + return self.core_loader.get_source(environment, template[1:]) + # check if the template is probably an absolute path + fs_path = template.replace('/', path.sep) + if path.isabs(fs_path): + if not path.exists(fs_path): + raise jinja2.TemplateNotFound(template) + f = codecs.open(fs_path, 'r', self.encoding) + try: + mtime = path.getmtime(path) + return (f.read(), fs_path, + lambda: mtime == path.getmtime(path)) + finally: + f.close() + # finally try to load from custom templates + return self.all_loaders.get_source(environment, template) + + +class BuiltinTemplates(TemplateBridge): + """ + Interfaces the rendering environment of jinja2 for use in sphinx. + """ + + def init(self, builder): + base_templates_path = path.join(path.dirname(__file__), 'templates') + ext_templates_path = [path.join(builder.confdir, dir) + for dir in builder.config.templates_path] + self.templates_path = [base_templates_path] + ext_templates_path + loader = SphinxLoader(base_templates_path, ext_templates_path) + use_i18n = builder.translator is not None + extensions = use_i18n and ['jinja2.ext.i18n'] or [] + self.environment = jinja2.Environment(loader=loader, + extensions=extensions) + if use_i18n: + self.environment.install_gettext_translations(builder.translator) + + def render(self, template, context): + return self.environment.get_template(template).render(context) + + def newest_template_mtime(self): + return max(mtimes_of_files(self.templates_path, '.html')) diff --git a/sphinx/builder.py b/sphinx/builder.py index 159fe8038..24c42d2b7 100644 --- a/sphinx/builder.py +++ b/sphinx/builder.py @@ -98,7 +98,7 @@ class Builder(object): self.templates = self.app.import_object( self.config.template_bridge, 'template_bridge setting')() else: - from sphinx._jinja import BuiltinTemplates + from sphinx._jinja2 import BuiltinTemplates self.templates = BuiltinTemplates() self.templates.init(self) diff --git a/sphinx/templates/layout.html b/sphinx/templates/layout.html index 5ad4f8dd1..e6374b6de 100644 --- a/sphinx/templates/layout.html +++ b/sphinx/templates/layout.html @@ -4,7 +4,7 @@ {%- endblock %} {%- set reldelim1 = reldelim1 is not defined and ' »' or reldelim1 %} {%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %} -{%- macro relbar %} +{%- macro relbar() %}
{%- endmacro %} -{%- macro sidebar %} +{%- macro sidebar() %} {%- if builder != 'htmlhelp' %}