44 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
import io
 | 
						|
from lingua.extractors import Extractor
 | 
						|
from lingua.extractors import Message
 | 
						|
from lingua.extractors import get_extractor
 | 
						|
from mako.ext.extract import MessageExtractor
 | 
						|
from mako import compat
 | 
						|
 | 
						|
 | 
						|
class LinguaMakoExtractor(Extractor, MessageExtractor):
 | 
						|
 | 
						|
    '''Mako templates'''
 | 
						|
    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:
 | 
						|
            fileobj = open(filename, 'rb')
 | 
						|
        return self.process_file(fileobj)
 | 
						|
 | 
						|
    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
 |