Anonymous avatar Anonymous committed 86843bd

Switched templating to jinja2

Comments (0)

Files changed (6)

-[extractors]
-jinja = sphinx._jinja.babel_extract
 [python: **.py]
-[jinja: **/templates/**.html]
-[jinja: **/templates/**.xml]
+[jinja2: **/templates/**.html]
+[jinja2: **/templates/**.xml]
 [javascript: **.js]
-# -*- coding: utf-8 -*-
+0;115;0c# -*- coding: utf-8 -*-
 import ez_setup
 ez_setup.use_setuptools()
 
   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.'

sphinx/_jinja2.py

+# -*- 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'))

sphinx/builder.py

             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)
 

sphinx/templates/layout.html

 {%- endblock %}
 {%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
 {%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
-{%- macro relbar %}
+{%- macro relbar() %}
     <div class="related">
       <h3>{{ _('Navigation') }}</h3>
       <ul>
       </ul>
     </div>
 {%- endmacro %}
-{%- macro sidebar %}
+{%- macro sidebar() %}
       {%- if builder != 'htmlhelp' %}
       <div class="sphinxsidebar">
         <div class="sphinxsidebarwrapper">
             </ul>
           {%- endif %}
           {%- if customsidebar %}
-          {{ rendertemplate(customsidebar) }}
+          {% include customsidebar %}
           {%- endif %}
           {%- block sidebarsearch %}
           {%- if pagename != "search" %}

sphinx/templates/modindex.html

      {% if fname %}<a href="{{ fname }}">{% endif -%}
      <tt class="xref">{{ modname|e }}</tt>
      {%- if fname %}</a>{% endif %}
-   {%- if pform[0] %} <em>({{ pform|join(', ') }})</em>{% endif -%}
+   {%- if pform and pform[0] %} <em>({{ pform|join(', ') }})</em>{% endif -%}
    </td><td>{% if dep %}<strong>{{ _('Deprecated')}}:</strong>{% endif %}
      <em>{{ synops|e }}</em></td></tr>
    {%- endif -%}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.