| # ext/babelplugin.py |
| # Copyright (C) 2006-2016 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 |
| |
| """gettext message extraction via Babel: http://babel.edgewall.org/""" |
| from babel.messages.extract import extract_python |
| from mako.ext.extract import MessageExtractor |
| |
| |
| class BabelMakoExtractor(MessageExtractor): |
| |
| def __init__(self, keywords, comment_tags, options): |
| self.keywords = keywords |
| self.options = options |
| self.config = { |
| 'comment-tags': u' '.join(comment_tags), |
| 'encoding': options.get('input_encoding', |
| options.get('encoding', None)), |
| } |
| super(BabelMakoExtractor, self).__init__() |
| |
| def __call__(self, fileobj): |
| return self.process_file(fileobj) |
| |
| def process_python(self, code, code_lineno, translator_strings): |
| comment_tags = self.config['comment-tags'] |
| for lineno, funcname, messages, python_translator_comments \ |
| in extract_python(code, |
| self.keywords, comment_tags, self.options): |
| yield (code_lineno + (lineno - 1), funcname, messages, |
| translator_strings + python_translator_comments) |
| |
| |
| def extract(fileobj, keywords, comment_tags, options): |
| """Extract messages from Mako templates. |
| |
| :param fileobj: the file-like object the messages should be extracted from |
| :param keywords: a list of keywords (i.e. function names) that should be |
| recognized as translation functions |
| :param comment_tags: a list of translator tags to search for and include |
| in the results |
| :param options: a dictionary of additional options (optional) |
| :return: an iterator over ``(lineno, funcname, message, comments)`` tuples |
| :rtype: ``iterator`` |
| """ |
| extractor = BabelMakoExtractor(keywords, comment_tags, options) |
| for message in extractor(fileobj): |
| yield message |