From 4d813cabf9bd5dc8ea54673dae2d24a802a10fe3 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 24 Dec 2013 07:04:27 -0500 Subject: 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 --- mako/ext/babelplugin.py | 18 +++++++----------- test/templates/gettext.mako | 9 +++++++++ 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')} +## TRANSLATOR:

tag is ok? +

${_("Inside a p tag")}

+ +## TRANSLATOR: also this +

${even_with_other_code_first()} - ${_("Later in a p tag")}

+ +## TRANSLATOR: we still ignore comments too far from the string + +

${_("No action at a distance.")}

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:

tag is ok?']), + (95, '_', 'Later in a p tag', ['TRANSLATOR: also this']), + (99, '_', 'No action at a distance.', []), ] self.assertEqual(expected, messages) -- cgit v1.2.3