Skip to content

Commit

Permalink
Merge pull request #9251 from tk0miya/9216_support_jinja2-3
Browse files Browse the repository at this point in the history
Close #9216: Support jinja2-3.0
  • Loading branch information
tk0miya committed May 19, 2021
2 parents ca36c9a + 4b8fb68 commit c015f97
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 17 deletions.
2 changes: 2 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ Release 4.0.2 (in development)
Dependencies
------------

* #9216: Support jinja2-3.0

Incompatible changes
--------------------

Expand Down
3 changes: 1 addition & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@
'sphinxcontrib-htmlhelp',
'sphinxcontrib-serializinghtml',
'sphinxcontrib-qthelp',
'Jinja2>=2.3,<3.0',
'MarkupSafe<2.0',
'Jinja2>=2.3',
'Pygments>=2.0',
'docutils>=0.14,<0.18',
'snowballstemmer>=1.1',
Expand Down
13 changes: 9 additions & 4 deletions sphinx/jinja2glue.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from pprint import pformat
from typing import TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Tuple, Union

from jinja2 import BaseLoader, FileSystemLoader, TemplateNotFound, contextfunction
from jinja2 import BaseLoader, FileSystemLoader, TemplateNotFound
from jinja2.environment import Environment
from jinja2.sandbox import SandboxedEnvironment
from jinja2.utils import open_if_exists
Expand All @@ -22,6 +22,11 @@
from sphinx.util import logging
from sphinx.util.osutil import mtimes_of_files

try:
from jinja2.utils import pass_context
except ImportError:
from jinja2 import contextfunction as pass_context

if TYPE_CHECKING:
from sphinx.builders import Builder

Expand Down Expand Up @@ -101,7 +106,7 @@ def __next__(self) -> int:
next = __next__ # Python 2/Jinja compatibility


@contextfunction
@pass_context
def warning(context: Dict, message: str, *args: Any, **kwargs: Any) -> str:
if 'pagename' in context:
filename = context.get('pagename') + context.get('file_suffix', '')
Expand Down Expand Up @@ -180,9 +185,9 @@ def init(self, builder: "Builder", theme: Theme = None, dirs: List[str] = None)
self.environment.filters['toint'] = _toint
self.environment.filters['todim'] = _todim
self.environment.filters['slice_index'] = _slice_index
self.environment.globals['debug'] = contextfunction(pformat)
self.environment.globals['debug'] = pass_context(pformat)
self.environment.globals['warning'] = warning
self.environment.globals['accesskey'] = contextfunction(accesskey)
self.environment.globals['accesskey'] = pass_context(accesskey)
self.environment.globals['idgen'] = idgen
if use_i18n:
self.environment.install_gettext_translations(builder.app.translator)
Expand Down
2 changes: 1 addition & 1 deletion sphinx/util/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ def save_traceback(app: "Sphinx") -> str:
platform.python_version(),
platform.python_implementation(),
docutils.__version__, docutils.__version_details__,
jinja2.__version__, # type: ignore
jinja2.__version__,
last_msgs)).encode())
if app is not None:
for ext in app.extensions.values():
Expand Down
12 changes: 9 additions & 3 deletions sphinx/util/rst.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,17 @@
from docutils.parsers.rst.languages import en as english
from docutils.statemachine import StringList
from docutils.utils import Reporter
from jinja2 import Environment, environmentfilter
from jinja2 import Environment

from sphinx.locale import __
from sphinx.util import docutils, logging

try:
from jinja2.utils import pass_environment
except ImportError:
from jinja2 import environmentfilter as pass_environment


logger = logging.getLogger(__name__)

docinfo_re = re.compile(':\\w+:.*?')
Expand Down Expand Up @@ -51,11 +57,11 @@ def charwidth(char: str, widechars: str) -> int:
return sum(charwidth(c, widechars) for c in text)


@environmentfilter
@pass_environment
def heading(env: Environment, text: str, level: int = 1) -> str:
"""Create a heading for *level*."""
assert level <= 3
width = textwidth(text, WIDECHARS[env.language]) # type: ignore
width = textwidth(text, WIDECHARS[env.language])
sectioning_char = SECTIONING_CHARS[level - 1]
return '%s\n%s' % (text, sectioning_char * width)

Expand Down
14 changes: 7 additions & 7 deletions sphinx/util/tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,18 +69,18 @@ def eval_condition(self, condition: str) -> bool:

def eval_node(node: Node) -> bool:
if isinstance(node, nodes.CondExpr):
if eval_node(node.test): # type: ignore
return eval_node(node.expr1) # type: ignore
if eval_node(node.test):
return eval_node(node.expr1)
else:
return eval_node(node.expr2) # type: ignore
return eval_node(node.expr2)
elif isinstance(node, nodes.And):
return eval_node(node.left) and eval_node(node.right) # type: ignore
return eval_node(node.left) and eval_node(node.right)
elif isinstance(node, nodes.Or):
return eval_node(node.left) or eval_node(node.right) # type: ignore
return eval_node(node.left) or eval_node(node.right)
elif isinstance(node, nodes.Not):
return not eval_node(node.node) # type: ignore
return not eval_node(node.node)
elif isinstance(node, nodes.Name):
return self.tags.get(node.name, False) # type: ignore
return self.tags.get(node.name, False)
else:
raise ValueError('invalid node, check parsing')

Expand Down

0 comments on commit c015f97

Please sign in to comment.