| Index: third_party/jinja2/ext.py
|
| diff --git a/third_party/jinja2/ext.py b/third_party/jinja2/ext.py
|
| index 5ba6efdbf870aae8334a06c8ed2e14eb639c7254..c2df12d5592c4275135beffdb2194b22877c4654 100644
|
| --- a/third_party/jinja2/ext.py
|
| +++ b/third_party/jinja2/ext.py
|
| @@ -10,13 +10,17 @@
|
| :copyright: (c) 2010 by the Jinja Team.
|
| :license: BSD.
|
| """
|
| -from collections import deque
|
| from jinja2 import nodes
|
| -from jinja2.defaults import *
|
| +from jinja2.defaults import BLOCK_START_STRING, \
|
| + BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \
|
| + COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \
|
| + LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \
|
| + KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS
|
| from jinja2.environment import Environment
|
| -from jinja2.runtime import Undefined, concat
|
| +from jinja2.runtime import concat
|
| from jinja2.exceptions import TemplateAssertionError, TemplateSyntaxError
|
| -from jinja2.utils import contextfunction, import_string, Markup, next
|
| +from jinja2.utils import contextfunction, import_string, Markup
|
| +from jinja2._compat import next, with_metaclass, string_types, iteritems
|
|
|
|
|
| # the only real useful gettext functions for a Jinja template. Note
|
| @@ -34,7 +38,7 @@ class ExtensionRegistry(type):
|
| return rv
|
|
|
|
|
| -class Extension(object):
|
| +class Extension(with_metaclass(ExtensionRegistry, object)):
|
| """Extensions can be used to add extra functionality to the Jinja template
|
| system at the parser level. Custom extensions are bound to an environment
|
| but may not store environment specific data on `self`. The reason for
|
| @@ -52,7 +56,6 @@ class Extension(object):
|
| is a terrible name, ``fragment_cache_prefix`` on the other hand is a good
|
| name as includes the name of the extension (fragment cache).
|
| """
|
| - __metaclass__ = ExtensionRegistry
|
|
|
| #: if this extension parses this is the list of tags it's listening to.
|
| tags = set()
|
| @@ -205,7 +208,7 @@ class InternationalizationExtension(Extension):
|
| self.environment.globals.pop(key, None)
|
|
|
| def _extract(self, source, gettext_functions=GETTEXT_FUNCTIONS):
|
| - if isinstance(source, basestring):
|
| + if isinstance(source, string_types):
|
| source = self.environment.parse(source)
|
| return extract_from_ast(source, gettext_functions)
|
|
|
| @@ -218,6 +221,7 @@ class InternationalizationExtension(Extension):
|
| # defined in the body of the trans block too, but this is checked at
|
| # a later state.
|
| plural_expr = None
|
| + plural_expr_assignment = None
|
| variables = {}
|
| while parser.stream.current.type != 'block_end':
|
| if variables:
|
| @@ -241,7 +245,13 @@ class InternationalizationExtension(Extension):
|
| variables[name.value] = var = nodes.Name(name.value, 'load')
|
|
|
| if plural_expr is None:
|
| - plural_expr = var
|
| + if isinstance(var, nodes.Call):
|
| + plural_expr = nodes.Name('_trans', 'load')
|
| + variables[name.value] = plural_expr
|
| + plural_expr_assignment = nodes.Assign(
|
| + nodes.Name('_trans', 'store'), var)
|
| + else:
|
| + plural_expr = var
|
| num_called_num = name.value == 'num'
|
|
|
| parser.stream.expect('block_end')
|
| @@ -291,7 +301,10 @@ class InternationalizationExtension(Extension):
|
| bool(referenced),
|
| num_called_num and have_plural)
|
| node.set_lineno(lineno)
|
| - return node
|
| + if plural_expr_assignment is not None:
|
| + return [plural_expr_assignment, node]
|
| + else:
|
| + return node
|
|
|
| def _parse_block(self, parser, allow_pluralize):
|
| """Parse until the next block tag with a given name."""
|
| @@ -354,7 +367,7 @@ class InternationalizationExtension(Extension):
|
| # enough to handle the variable expansion and autoescape
|
| # handling itself
|
| if self.environment.newstyle_gettext:
|
| - for key, value in variables.iteritems():
|
| + for key, value in iteritems(variables):
|
| # the function adds that later anyways in case num was
|
| # called num, so just skip it.
|
| if num_called_num and key == 'num':
|
| @@ -476,7 +489,7 @@ def extract_from_ast(node, gettext_functions=GETTEXT_FUNCTIONS,
|
| strings = []
|
| for arg in node.args:
|
| if isinstance(arg, nodes.Const) and \
|
| - isinstance(arg.value, basestring):
|
| + isinstance(arg.value, string_types):
|
| strings.append(arg.value)
|
| else:
|
| strings.append(None)
|
| @@ -552,6 +565,10 @@ def babel_extract(fileobj, keywords, comment_tags, options):
|
| The `newstyle_gettext` flag can be set to `True` to enable newstyle
|
| gettext calls.
|
|
|
| + .. versionchanged:: 2.7
|
| + A `silent` option can now be provided. If set to `False` template
|
| + syntax errors are propagated instead of being ignored.
|
| +
|
| :param fileobj: the file-like object the messages should be extracted from
|
| :param keywords: a list of keywords (i.e. function names) that should be
|
| recognized as translation functions
|
| @@ -571,8 +588,10 @@ def babel_extract(fileobj, keywords, comment_tags, options):
|
| extensions.add(InternationalizationExtension)
|
|
|
| def getbool(options, key, default=False):
|
| - options.get(key, str(default)).lower() in ('1', 'on', 'yes', 'true')
|
| + return options.get(key, str(default)).lower() in \
|
| + ('1', 'on', 'yes', 'true')
|
|
|
| + silent = getbool(options, 'silent', True)
|
| environment = Environment(
|
| options.get('block_start_string', BLOCK_START_STRING),
|
| options.get('block_end_string', BLOCK_END_STRING),
|
| @@ -583,7 +602,10 @@ def babel_extract(fileobj, keywords, comment_tags, options):
|
| options.get('line_statement_prefix') or LINE_STATEMENT_PREFIX,
|
| options.get('line_comment_prefix') or LINE_COMMENT_PREFIX,
|
| getbool(options, 'trim_blocks', TRIM_BLOCKS),
|
| - NEWLINE_SEQUENCE, frozenset(extensions),
|
| + getbool(options, 'lstrip_blocks', LSTRIP_BLOCKS),
|
| + NEWLINE_SEQUENCE,
|
| + getbool(options, 'keep_trailing_newline', KEEP_TRAILING_NEWLINE),
|
| + frozenset(extensions),
|
| cache_size=0,
|
| auto_reload=False
|
| )
|
| @@ -595,7 +617,9 @@ def babel_extract(fileobj, keywords, comment_tags, options):
|
| try:
|
| node = environment.parse(source)
|
| tokens = list(environment.lex(environment.preprocess(source)))
|
| - except TemplateSyntaxError, e:
|
| + except TemplateSyntaxError as e:
|
| + if not silent:
|
| + raise
|
| # skip templates with syntax errors
|
| return
|
|
|
|
|