def test_translator_comment(self): input = io.BytesIO(compat.b(''' <p> ## TRANSLATORS: This is a comment. ${_("Message")} </p>''')) messages = list(extract(input, ['_'], ['TRANSLATORS:'], {})) self.assertEqual( messages, [(4, '_', compat.u('Message'), [compat.u('TRANSLATORS: This is a comment.')])])
def test_translator_comment(self): input = io.BytesIO( compat.b(''' <p> ## TRANSLATORS: This is a comment. ${_("Message")} </p>''')) messages = list(extract(input, ['_'], ['TRANSLATORS:'], {})) self.assertEqual(messages, [(4, '_', compat.u('Message'), [compat.u('TRANSLATORS: This is a comment.')])])
def process_python(self, code, code_lineno, translator_strings): source = code.getvalue().strip() if source.endswith(compat.b(':')): if source in (compat.b('try:'), compat.b('else:')) or source.startswith(compat.b('except')): source = compat.b('') # Ignore try/except and else elif source.startswith(compat.b('elif')): source = source[2:] # Replace "elif" with "if" source += compat.b('pass') code = io.BytesIO(source) for msg in self.python_extractor( self.filename, self.options, code, code_lineno -1): if translator_strings: msg = Message(msg.msgctxt, msg.msgid, msg.msgid_plural, msg.flags, compat.u(' ').join( translator_strings + [msg.comment]), msg.tcomment, msg.location) yield msg
def process_python(self, code, code_lineno, translator_strings): source = code.getvalue().strip() if source.endswith(compat.b(':')): if source in (compat.b('try:'), compat.b('else:')) or source.startswith( compat.b('except')): source = compat.b('') # Ignore try/except and else elif source.startswith(compat.b('elif')): source = source[2:] # Replace "elif" with "if" source += compat.b('pass') code = io.BytesIO(source) for msg in self.python_extractor(self.filename, self.options, code, code_lineno - 1): if translator_strings: msg = Message( msg.msgctxt, msg.msgid, msg.msgid_plural, msg.flags, compat.u(' ').join(translator_strings + [msg.comment]), msg.tcomment, msg.location) yield msg
def extract_nodes(self, nodes): translator_comments = [] in_translator_comments = False input_encoding = self.config['encoding'] or 'ascii' comment_tags = list( [_f for _f in re.split(r'\s+', self.config['comment-tags']) if _f]) for node in nodes: child_nodes = None if in_translator_comments and \ isinstance(node, nodes.Text) and \ not node.content.strip(): # Ignore whitespace within translator comments continue if isinstance(node, nodes.Comment): value = node.text.strip() if in_translator_comments: translator_comments.extend( self._split_comment(node.lineno, value)) continue for comment_tag in comment_tags: if value.startswith(comment_tag): in_translator_comments = True translator_comments.extend( self._split_comment(node.lineno, value)) continue if isinstance(node, nodes.DefTag): code = node.function_decl.code child_nodes = node.nodes elif isinstance(node, nodes.BlockTag): code = node.body_decl.code child_nodes = node.nodes elif isinstance(node, nodes.CallTag): code = node.code.code child_nodes = node.nodes elif isinstance(node, nodes.PageTag): code = node.body_decl.code elif isinstance(node, nodes.CallNamespaceTag): code = node.expression child_nodes = node.nodes elif isinstance(node, nodes.ControlLine): if node.isend: in_translator_comments = False continue code = node.text elif isinstance(node, nodes.Code): in_translator_comments = False code = node.code.code elif isinstance(node, nodes.Expression): code = node.code.code else: continue # Comments don't apply unless they immediately preceed the message if translator_comments and \ translator_comments[-1][0] < node.lineno - 1: translator_comments = [] translator_strings = [ comment[1] for comment in translator_comments] if isinstance(code, compat.text_type): code = code.encode(input_encoding, 'backslashreplace') used_translator_comments = False # We add extra newline to work around a pybabel bug # (see python-babel/babel#274, parse_encoding dies if the first # input string of the input is non-ascii) # Also, because we added it, we have to subtract one from # node.lineno code = compat.byte_buffer(compat.b('\n') + code) for message in self.process_python( code, node.lineno - 1, translator_strings): yield message used_translator_comments = True if used_translator_comments: translator_comments = [] in_translator_comments = False if child_nodes: for extracted in self.extract_nodes(child_nodes): yield extracted
def __str__(self): return compat.b("å")
def test_python_gettext_call(self): input = io.BytesIO(compat.b('<p>${_("Message")}</p>')) messages = list(extract(input, ['_'], [], {})) self.assertEqual(messages, [(1, '_', compat.u('Message'), [])])