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]
|
[python: **.py]
|
||||||
[jinja: **/templates/**.html]
|
[jinja2: **/templates/**.html]
|
||||||
[jinja: **/templates/**.xml]
|
[jinja2: **/templates/**.xml]
|
||||||
[javascript: **.js]
|
[javascript: **.js]
|
||||||
|
4
setup.py
4
setup.py
@ -1,4 +1,4 @@
|
|||||||
# -*- coding: utf-8 -*-
|
0;115;0c# -*- coding: utf-8 -*-
|
||||||
import ez_setup
|
import ez_setup
|
||||||
ez_setup.use_setuptools()
|
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.
|
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):
|
if sys.version_info < (2, 4):
|
||||||
print 'ERROR: Sphinx requires at least Python 2.4 to run.'
|
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.templates = self.app.import_object(
|
||||||
self.config.template_bridge, 'template_bridge setting')()
|
self.config.template_bridge, 'template_bridge setting')()
|
||||||
else:
|
else:
|
||||||
from sphinx._jinja import BuiltinTemplates
|
from sphinx._jinja2 import BuiltinTemplates
|
||||||
self.templates = BuiltinTemplates()
|
self.templates = BuiltinTemplates()
|
||||||
self.templates.init(self)
|
self.templates.init(self)
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
{%- endblock %}
|
{%- endblock %}
|
||||||
{%- set reldelim1 = reldelim1 is not defined and ' »' or reldelim1 %}
|
{%- set reldelim1 = reldelim1 is not defined and ' »' or reldelim1 %}
|
||||||
{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
|
{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
|
||||||
{%- macro relbar %}
|
{%- macro relbar() %}
|
||||||
<div class="related">
|
<div class="related">
|
||||||
<h3>{{ _('Navigation') }}</h3>
|
<h3>{{ _('Navigation') }}</h3>
|
||||||
<ul>
|
<ul>
|
||||||
@ -24,7 +24,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
{%- endmacro %}
|
{%- endmacro %}
|
||||||
{%- macro sidebar %}
|
{%- macro sidebar() %}
|
||||||
{%- if builder != 'htmlhelp' %}
|
{%- if builder != 'htmlhelp' %}
|
||||||
<div class="sphinxsidebar">
|
<div class="sphinxsidebar">
|
||||||
<div class="sphinxsidebarwrapper">
|
<div class="sphinxsidebarwrapper">
|
||||||
@ -64,7 +64,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- if customsidebar %}
|
{%- if customsidebar %}
|
||||||
{{ rendertemplate(customsidebar) }}
|
{% include customsidebar %}
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- block sidebarsearch %}
|
{%- block sidebarsearch %}
|
||||||
{%- if pagename != "search" %}
|
{%- if pagename != "search" %}
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
{% if fname %}<a href="{{ fname }}">{% endif -%}
|
{% if fname %}<a href="{{ fname }}">{% endif -%}
|
||||||
<tt class="xref">{{ modname|e }}</tt>
|
<tt class="xref">{{ modname|e }}</tt>
|
||||||
{%- if fname %}</a>{% endif %}
|
{%- 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 %}
|
</td><td>{% if dep %}<strong>{{ _('Deprecated')}}:</strong>{% endif %}
|
||||||
<em>{{ synops|e }}</em></td></tr>
|
<em>{{ synops|e }}</em></td></tr>
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
Loading…
Reference in New Issue
Block a user