| # ext/linguaplugin.py |
| # Copyright 2006-2023 the Mako authors and contributors <see AUTHORS file> |
| # |
| # This module is part of Mako and is released under |
| # the MIT License: http://www.opensource.org/licenses/mit-license.php |
| |
| import contextlib |
| import io |
| |
| from lingua.extractors import Extractor |
| from lingua.extractors import get_extractor |
| from lingua.extractors import Message |
| |
| from mako.ext.extract import MessageExtractor |
| |
| |
| class LinguaMakoExtractor(Extractor, MessageExtractor): |
| """Mako templates""" |
| |
| use_bytes = False |
| extensions = [".mako"] |
| default_config = {"encoding": "utf-8", "comment-tags": ""} |
| |
| def __call__(self, filename, options, fileobj=None): |
| self.options = options |
| self.filename = filename |
| self.python_extractor = get_extractor("x.py") |
| if fileobj is None: |
| ctx = open(filename, "r") |
| else: |
| ctx = contextlib.nullcontext(fileobj) |
| with ctx as file_: |
| yield from self.process_file(file_) |
| |
| def process_python(self, code, code_lineno, translator_strings): |
| source = code.getvalue().strip() |
| if source.endswith(":"): |
| if source in ("try:", "else:") or source.startswith("except"): |
| source = "" # Ignore try/except and else |
| elif source.startswith("elif"): |
| source = source[2:] # Replace "elif" with "if" |
| source += "pass" |
| code = io.StringIO(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, |
| " ".join(translator_strings + [msg.comment]), |
| msg.tcomment, |
| msg.location, |
| ) |
| yield msg |