diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2013-12-24 07:04:27 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2013-12-24 11:10:24 -0500 |
commit | 4d813cabf9bd5dc8ea54673dae2d24a802a10fe3 (patch) | |
tree | 4344001e9dffc4104102465bef256d2c3779b59a | |
parent | 62926b5d9c3bb2d5459d8a2c78b700c33530a333 (diff) | |
download | external_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.py | 18 | ||||
-rw-r--r-- | test/templates/gettext.mako | 9 | ||||
-rw-r--r-- | test/test_babelplugin.py | 5 |
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) |