Exemple #1
0
 def process_python(self, code, code_lineno, translator_strings):
     source = code.getvalue().strip()
     if source.endswith(compat.b(':')):
         source += compat.b(' pass')
         code = io.BytesIO(source)
     for msg in self.python_extractor(self.filename, self.options, code,
                                      code_lineno):
         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
Exemple #2
0
 def process_python(self, code, code_lineno, translator_strings):
     source = code.getvalue().strip()
     if source.endswith(compat.b(':')):
         source += compat.b(' pass')
         code = io.BytesIO(source)
     for msg in self.python_extractor(
             self.filename, self.options, code, code_lineno):
         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 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.")],
         )],
     )
Exemple #6
0
 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
Exemple #7
0
    def extract_nodes(self, nodes):
        translator_comments = []
        in_translator_comments = False
        input_encoding = self.config["encoding"] or "ascii"
        comment_tags = list(
            filter(None, re.split(r"\s+", self.config["comment-tags"])))

        for node in nodes:
            child_nodes = None
            if (in_translator_comments and isinstance(node, parsetree.Text)
                    and not node.content.strip()):
                # Ignore whitespace within translator comments
                continue

            if isinstance(node, parsetree.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, parsetree.DefTag):
                code = node.function_decl.code
                child_nodes = node.nodes
            elif isinstance(node, parsetree.BlockTag):
                code = node.body_decl.code
                child_nodes = node.nodes
            elif isinstance(node, parsetree.CallTag):
                code = node.code.code
                child_nodes = node.nodes
            elif isinstance(node, parsetree.PageTag):
                code = node.body_decl.code
            elif isinstance(node, parsetree.CallNamespaceTag):
                code = node.expression
                child_nodes = node.nodes
            elif isinstance(node, parsetree.ControlLine):
                if node.isend:
                    in_translator_comments = False
                    continue
                code = node.text
            elif isinstance(node, parsetree.Code):
                in_translator_comments = False
                code = node.code.code
            elif isinstance(node, parsetree.Expression):
                code = node.code.code
            else:
                continue

            # Comments don't apply unless they immediately precede 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 test_python_gettext_call(self):
     input_ = io.BytesIO(compat.b('<p>${_("Message")}</p>'))
     messages = list(extract(input_, ["_"], [], {}))
     self.assertEqual(messages, [(1, "_", compat.u("Message"), [])])
Exemple #9
0
 def __str__(self):
     return compat.b("å")
Exemple #10
0
 def __str__(self):
     return compat.b("å")
Exemple #11
0
    def extract_nodes(self, nodes):
        translator_comments = []
        in_translator_comments = False
        input_encoding = self.config['encoding'] or 'ascii'
        comment_tags = list(
            filter(None, re.split(r'\s+', self.config['comment-tags'])))

        for node in nodes:
            child_nodes = None
            if in_translator_comments and \
                    isinstance(node, parsetree.Text) and \
                    not node.content.strip():
                # Ignore whitespace within translator comments
                continue

            if isinstance(node, parsetree.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, parsetree.DefTag):
                code = node.function_decl.code
                child_nodes = node.nodes
            elif isinstance(node, parsetree.BlockTag):
                code = node.body_decl.code
                child_nodes = node.nodes
            elif isinstance(node, parsetree.CallTag):
                code = node.code.code
                child_nodes = node.nodes
            elif isinstance(node, parsetree.PageTag):
                code = node.body_decl.code
            elif isinstance(node, parsetree.CallNamespaceTag):
                code = node.expression
                child_nodes = node.nodes
            elif isinstance(node, parsetree.ControlLine):
                if node.isend:
                    in_translator_comments = False
                    continue
                code = node.text
            elif isinstance(node, parsetree.Code):
                in_translator_comments = False
                code = node.code.code
            elif isinstance(node, parsetree.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
Exemple #12
0
 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'), [])])