summaryrefslogtreecommitdiffstats
path: root/nikola/plugins/template_mako.py
diff options
context:
space:
mode:
Diffstat (limited to 'nikola/plugins/template_mako.py')
-rw-r--r--nikola/plugins/template_mako.py68
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])