Search code examples
pythonpreprocessorhamlmako

Choose Mako preprocessor based on file extension?


I would like to somehow instrument a mako.lookup.TemplateLookup such that it applies certain preprocessors only for certain file extensions.

Specifically, I have a haml.preprocessor that I would like to apply to all templates whose file name ends with .haml.

Thanks!


Solution

  • You should be able to customize TemplateLookup to get the behavior you want.

    customlookup.py

    from mako.lookup import TemplateLookup
    import haml
    
    class Lookup(TemplateLookup):
        def get_template(self, uri):
            if uri.rsplit('.')[1] == 'haml':
                # change preprocessor used for this template
                default = self.template_args['preprocessor']
                self.template_args['preprocessor'] = haml.preprocessor
                template = super(Lookup, self).get_template(uri)
                # change it back
                self.template_args['preprocessor'] = default
            else:
                template = super(Lookup, self).get_template(uri)
            return template
    
    lookup = Lookup(['.'])
    print lookup.get_template('index.haml').render()
    

    index.haml

    <%inherit file="base.html"/>
    
    <%block name="content">
      %h1 Hello
    </%block>
    

    base.html

    <html>
      <body>
        <%block name="content"/>
      </body>
    </html>