1 # -*- coding: utf-8 -*-
6 An example extension for Jinja2 that supports inline gettext calls.
7 Requires the i18n extension to be loaded.
9 :copyright: (c) 2009 by the Jinja Team.
13 from jinja2.ext import Extension
14 from jinja2.lexer import Token, count_newlines
15 from jinja2.exceptions import TemplateSyntaxError
18 _outside_re = re.compile(r'\\?(gettext|_)\(')
19 _inside_re = re.compile(r'\\?[()]')
22 class InlineGettext(Extension):
23 """This extension implements support for inline gettext blocks::
26 <p>_(This is a paragraph)</p>
28 Requires the i18n extension to be loaded and configured.
31 def filter_stream(self, stream):
35 if token.type is not 'data':
44 match = _outside_re.search(token.value, pos)
46 match = _inside_re.search(token.value, pos)
49 new_pos = match.start()
51 preval = token.value[pos:new_pos]
52 yield Token(lineno, 'data', preval)
53 lineno += count_newlines(preval)
56 yield Token(lineno, 'data', gtok[1:])
58 yield Token(lineno, 'block_begin', None)
59 yield Token(lineno, 'name', 'trans')
60 yield Token(lineno, 'block_end', None)
63 if gtok == '(' or paren_stack > 1:
64 yield Token(lineno, 'data', gtok)
65 paren_stack += gtok == ')' and -1 or 1
67 yield Token(lineno, 'block_begin', None)
68 yield Token(lineno, 'name', 'endtrans')
69 yield Token(lineno, 'block_end', None)
72 if pos < len(token.value):
73 yield Token(lineno, 'data', token.value[pos:])
76 raise TemplateSyntaxError('unclosed gettext expression',
77 token.lineno, stream.name,