mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Switched templating to jinja2
This commit is contained in:
parent
d02008f99d
commit
eeb494cf87
@ -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]
|
||||
|
4
setup.py
4
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.'
|
||||
|
90
sphinx/_jinja2.py
Normal file
90
sphinx/_jinja2.py
Normal file
@ -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'))
|
@ -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)
|
||||
|
||||
|
@ -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() %}
|
||||
<div class="related">
|
||||
<h3>{{ _('Navigation') }}</h3>
|
||||
<ul>
|
||||
@ -24,7 +24,7 @@
|
||||
</ul>
|
||||
</div>
|
||||
{%- endmacro %}
|
||||
{%- macro sidebar %}
|
||||
{%- macro sidebar() %}
|
||||
{%- if builder != 'htmlhelp' %}
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper">
|
||||
@ -64,7 +64,7 @@
|
||||
</ul>
|
||||
{%- endif %}
|
||||
{%- if customsidebar %}
|
||||
{{ rendertemplate(customsidebar) }}
|
||||
{% include customsidebar %}
|
||||
{%- endif %}
|
||||
{%- block sidebarsearch %}
|
||||
{%- if pagename != "search" %}
|
||||
|
@ -52,7 +52,7 @@
|
||||
{% 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 -%}
|
||||
|
Loading…
Reference in New Issue
Block a user