diff options
Diffstat (limited to 'nikola/plugins/template/mako.py')
| -rw-r--r-- | nikola/plugins/template/mako.py | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/nikola/plugins/template/mako.py b/nikola/plugins/template/mako.py index 8066b96..8197518 100644 --- a/nikola/plugins/template/mako.py +++ b/nikola/plugins/template/mako.py @@ -28,6 +28,7 @@ import io import os +import re import shutil from mako import exceptions, util, lexer, parsetree @@ -52,7 +53,7 @@ class MakoTemplates(TemplateSystem): directories = [] cache_dir = None - def get_string_deps(self, text, filename=None): + def get_string_deps(self, text, context=None, *, filename=None): """Find dependencies for a template string.""" lex = lexer.Lexer(text=text, filename=filename, input_encoding='utf-8') lex.parse() @@ -61,7 +62,11 @@ class MakoTemplates(TemplateSystem): for n in lex.template.nodes: keyword = getattr(n, 'keyword', None) if keyword in ["inherit", "namespace"] or isinstance(n, parsetree.IncludeTag): - deps.append(n.attributes['file']) + filename = n.attributes["file"] + if '${' in filename: + # Support for comment helper inclusions + filename = re.sub(r'''\${context\[['"](.*?)['"]]}''', lambda m: context[m.group(1)], filename) + deps.append(filename) # Some templates will include "foo.tmpl" and we need paths, so normalize them # using the template lookup for i, d in enumerate(deps): @@ -73,10 +78,10 @@ class MakoTemplates(TemplateSystem): d, filename) return deps - def get_deps(self, filename): + def get_deps(self, filename, context=None): """Get paths to dependencies for a template.""" text = util.read_file(filename) - return self.get_string_deps(text, filename) + return self.get_string_deps(text, context, filename=filename) def set_directories(self, directories, cache_folder): """Create a new template lookup with set directories.""" @@ -122,17 +127,17 @@ class MakoTemplates(TemplateSystem): context.update(self.filters) return Template(template, lookup=self.lookup).render(**context) - def template_deps(self, template_name): + def template_deps(self, template_name, context=None): """Generate list of dependencies for a template.""" # We can cache here because dependencies 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) + dep_filenames = self.get_deps(template.filename, context) deps = [template.filename] for fname in dep_filenames: # yes, it uses forward slashes on Windows - deps += self.template_deps(fname.split('/')[-1]) + deps += self.template_deps(fname.split('/')[-1], context) self.cache[template_name] = list(set(deps)) return self.cache[template_name] |
