diff options
| author | 2012-12-12 20:15:48 -0300 | |
|---|---|---|
| committer | 2012-12-12 20:15:48 -0300 | |
| commit | 0f2c04e70a0ffdd0892d6970cafbcd952d221db5 (patch) | |
| tree | d36f7747c4b9cb5c5e00cae5b137d22214b1c7be /nikola/plugins/template_mako.py | |
| parent | ca1f5a392261a7c6b82b5ac1015427605909d8c9 (diff) | |
Imported Upstream version 5upstream/5
Diffstat (limited to 'nikola/plugins/template_mako.py')
| -rw-r--r-- | nikola/plugins/template_mako.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/nikola/plugins/template_mako.py b/nikola/plugins/template_mako.py new file mode 100644 index 0000000..7ab5c43 --- /dev/null +++ b/nikola/plugins/template_mako.py @@ -0,0 +1,68 @@ +"""Mako template handlers""" + +import os +import shutil + +from mako import util, lexer +from mako.lookup import TemplateLookup + +from nikola.plugin_categories import TemplateSystem + + +class MakoTemplates(TemplateSystem): + """Wrapper for Mako templates.""" + + name = "mako" + + lookup = None + cache = {} + + def get_deps(self, filename): + text = util.read_file(filename) + lex = lexer.Lexer(text=text, filename=filename) + lex.parse() + + deps = [] + for n in lex.template.nodes: + if getattr(n, 'keyword', None) == "inherit": + deps.append(n.attributes['file']) + # TODO: include tags are not handled + return deps + + def set_directories(self, directories): + """Createa template lookup.""" + cache_dir = os.path.join('cache', '.mako.tmp') + if os.path.exists(cache_dir): + shutil.rmtree(cache_dir) + self.lookup = TemplateLookup( + directories=directories, + module_directory=cache_dir, + output_encoding='utf-8', + ) + + def render_template(self, template_name, output_name, context): + """Render the template into output_name using context.""" + + template = self.lookup.get_template(template_name) + data = template.render_unicode(**context) + if output_name is not None: + try: + os.makedirs(os.path.dirname(output_name)) + except: + pass + with open(output_name, 'w+') as output: + output.write(data) + return data + + def template_deps(self, template_name): + """Returns filenames which are dependencies for a template.""" + # We can cache here because depedencies should + # not change between runs + if self.cache.get(template_name, None) is None: + template = self.lookup.get_template(template_name) + dep_filenames = self.get_deps(template.filename) + deps = [template.filename] + for fname in dep_filenames: + deps += self.template_deps(fname) + self.cache[template_name] = tuple(deps) + return list(self.cache[template_name]) |
