aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2013-12-24 07:04:27 -0500
committerNed Batchelder <ned@nedbatchelder.com>2013-12-24 11:10:24 -0500
commit4d813cabf9bd5dc8ea54673dae2d24a802a10fe3 (patch)
tree4344001e9dffc4104102465bef256d2c3779b59a
parent62926b5d9c3bb2d5459d8a2c78b700c33530a333 (diff)
downloadexternal_python_mako-4d813cabf9bd5dc8ea54673dae2d24a802a10fe3.tar.gz
external_python_mako-4d813cabf9bd5dc8ea54673dae2d24a802a10fe3.tar.bz2
external_python_mako-4d813cabf9bd5dc8ea54673dae2d24a802a10fe3.zip
Improved handling of translator comments in Babel plugin
There's no reason an intervening node should clear the translator comments. There's already logic that discards the comments if they occurred too far away from the harvested string. This way we can write more natural templates and still have the translator comments that provide the best translated text. http://www.makotemplates.org/trac/ticket/225
-rw-r--r--mako/ext/babelplugin.py18
-rw-r--r--test/templates/gettext.mako9
-rw-r--r--test/test_babelplugin.py5
3 files changed, 20 insertions, 12 deletions
diff --git a/mako/ext/babelplugin.py b/mako/ext/babelplugin.py
index ba244bd..538c048 100644
--- a/mako/ext/babelplugin.py
+++ b/mako/ext/babelplugin.py
@@ -80,41 +80,37 @@ def extract_nodes(nodes, keywords, comment_tags, options):
child_nodes = node.nodes
elif isinstance(node, parsetree.ControlLine):
if node.isend:
- translator_comments = []
in_translator_comments = False
continue
code = node.text
elif isinstance(node, parsetree.Code):
- # <% and <%! blocks would provide their own translator comments
- translator_comments = []
in_translator_comments = False
-
code = node.code.code
elif isinstance(node, parsetree.Expression):
code = node.code.code
else:
- translator_comments = []
- in_translator_comments = False
continue
# Comments don't apply unless they immediately preceed the message
if translator_comments and \
translator_comments[-1][0] < node.lineno - 1:
translator_comments = []
- else:
- translator_comments = \
- [comment[1] for comment in translator_comments]
+
+ translator_strings = [comment[1] for comment in translator_comments]
if isinstance(code, compat.text_type):
code = code.encode('ascii', 'backslashreplace')
+ used_translator_comments = False
code = compat.byte_buffer(code)
for lineno, funcname, messages, python_translator_comments \
in extract_python(code, keywords, comment_tags, options):
yield (node.lineno + (lineno - 1), funcname, messages,
- translator_comments + python_translator_comments)
+ translator_strings + python_translator_comments)
+ used_translator_comments = True
- translator_comments = []
+ if used_translator_comments:
+ translator_comments = []
in_translator_comments = False
if child_nodes:
diff --git a/test/templates/gettext.mako b/test/templates/gettext.mako
index 367af55..ad07c5d 100644
--- a/test/templates/gettext.mako
+++ b/test/templates/gettext.mako
@@ -88,3 +88,12 @@ ${_(u'bar')}
</%def>
+## TRANSLATOR: <p> tag is ok?
+<p>${_("Inside a p tag")}</p>
+
+## TRANSLATOR: also this
+<p>${even_with_other_code_first()} - ${_("Later in a p tag")}</p>
+
+## TRANSLATOR: we still ignore comments too far from the string
+
+<p>${_("No action at a distance.")}</p>
diff --git a/test/test_babelplugin.py b/test/test_babelplugin.py
index 4118f4a..df2ed0f 100644
--- a/test/test_babelplugin.py
+++ b/test/test_babelplugin.py
@@ -40,7 +40,10 @@ class ExtractMakoTestCase(TemplateTest):
(77, '_', 'Top', []),
(83, '_', 'foo', []),
(83, '_', 'hoho', []),
- (85, '_', 'bar', [])
+ (85, '_', 'bar', []),
+ (92, '_', 'Inside a p tag', ['TRANSLATOR: <p> tag is ok?']),
+ (95, '_', 'Later in a p tag', ['TRANSLATOR: also this']),
+ (99, '_', 'No action at a distance.', []),
]
self.assertEqual(expected, messages)