| @@ -1,6 +1,6 @@ | |||
| # -*- coding: utf-8 -*- | |||
| """ | |||
| Autoextend css plugin | |||
| Autoextend plugin | |||
| """ | |||
| from hyde.plugin import Plugin | |||
| @@ -8,7 +8,7 @@ import re | |||
| class AutoExtendPlugin(Plugin): | |||
| """ | |||
| The plugin class for less css | |||
| The plugin class for extending templates using metadata. | |||
| """ | |||
| def __init__(self, site): | |||
| @@ -8,7 +8,7 @@ from hyde.fs import Folder | |||
| class FlattenerPlugin(Plugin): | |||
| """ | |||
| The plugin class for syntax text replacement. | |||
| The plugin class for flattening nested folders. | |||
| """ | |||
| def __init__(self, site): | |||
| super(FlattenerPlugin, self).__init__(site) | |||
| @@ -384,6 +384,7 @@ class Jinja2Template(Template): | |||
| self.env.globals['media_url'] = media_url | |||
| self.env.globals['content_url'] = content_url | |||
| self.env.globals['engine'] = engine | |||
| self.env.globals['deps'] = {} | |||
| self.env.filters['markdown'] = markdown | |||
| self.env.filters['syntax'] = syntax | |||
| @@ -411,10 +412,10 @@ class Jinja2Template(Template): | |||
| from jinja2.meta import find_referenced_templates | |||
| ast = self.env.parse(text) | |||
| tpls = find_referenced_templates(ast) | |||
| deps = [] | |||
| deps = list(self.env.globals['deps'].get('path', [])) | |||
| for dep in tpls: | |||
| deps.append(dep) | |||
| if dep: | |||
| deps.append(dep) | |||
| deps.extend(self.get_dependencies(dep)) | |||
| return list(set(deps)) | |||
| @@ -25,8 +25,8 @@ class Generator(object): | |||
| self.generated_once = False | |||
| self.__context__ = dict(site=site) | |||
| if hasattr(site.config, 'context'): | |||
| self.__context__.update( | |||
| Context.load(site.sitepath, site.config.context)) | |||
| site.context = Context.load(site.sitepath, site.config.context) | |||
| self.__context__.update(site.context) | |||
| self.template = None | |||
| Plugin.load_all(site) | |||
| @@ -108,6 +108,12 @@ class Generator(object): | |||
| logger.info("Generation Complete") | |||
| self.events.generation_complete() | |||
| def get_dependencies(self, resource): | |||
| """ | |||
| Gets the dependencies for a given resource. | |||
| """ | |||
| return self.template.get_dependencies(resource.relative_path) | |||
| def has_resource_changed(self, resource): | |||
| """ | |||
| Checks if the given resource has changed since the | |||
| @@ -126,7 +132,7 @@ class Generator(object): | |||
| if resource.source_file.is_binary or not resource.uses_template: | |||
| logger.debug("No Changes found in %s" % resource) | |||
| return False | |||
| deps = self.template.get_dependencies(resource.relative_path) | |||
| deps = self.get_dependencies(resource) | |||
| if not deps or None in deps: | |||
| logger.debug("No changes found in %s" % resource) | |||
| return False | |||
| @@ -134,6 +140,8 @@ class Generator(object): | |||
| layout = Folder(self.site.sitepath).child_folder('layout') | |||
| logger.debug("Checking for changes in dependents:%s" % deps) | |||
| for dep in deps: | |||
| if not dep: | |||
| return True | |||
| source = File(content.child(dep)) | |||
| if not source.exists: | |||
| source = File(layout.child(dep)) | |||
| @@ -348,6 +348,7 @@ class Site(object): | |||
| self.config = config if config else Config(self.sitepath) | |||
| self.content = RootNode(self.config.content_root_path, self) | |||
| self.plugins = [] | |||
| self.context = {} | |||
| def load(self): | |||
| """ | |||
| @@ -171,6 +171,39 @@ class TestJinjaTemplate(object): | |||
| assert 'layout.html' in deps | |||
| assert 'index.html' in deps | |||
| def test_depends_with_reference_tag(self): | |||
| site = Site(TEST_SITE) | |||
| JINJA2.copy_contents_to(site.content.source) | |||
| inc = File(TEST_SITE.child('content/inc.md')) | |||
| inc.write("{% refer to 'index.html' as index%}") | |||
| site.load() | |||
| gen = Generator(site) | |||
| gen.load_template_if_needed() | |||
| t = gen.template | |||
| deps = list(t.get_dependencies('inc.md')) | |||
| assert len(deps) == 3 | |||
| assert 'helpers.html' in deps | |||
| assert 'layout.html' in deps | |||
| assert 'index.html' in deps | |||
| def test_cant_find_depends_with_reference_tag_var(self): | |||
| site = Site(TEST_SITE) | |||
| JINJA2.copy_contents_to(site.content.source) | |||
| inc = File(TEST_SITE.child('content/inc.md')) | |||
| inc.write("{% set ind = 'index.html' %}{% refer to ind as index %}") | |||
| site.load() | |||
| gen = Generator(site) | |||
| gen.load_template_if_needed() | |||
| t = gen.template | |||
| deps = list(t.get_dependencies('inc.md')) | |||
| assert len(deps) == 1 | |||
| assert not deps[0] | |||
| def test_can_include_templates_with_processing(self): | |||
| text = """ | |||
| === | |||
| @@ -276,6 +309,34 @@ Hyde & Jinja. | |||
| text2 = """ | |||
| {% refer to "inc.md" as inc %} | |||
| {{ inc.html('.fulltext') }} | |||
| """ | |||
| html = assert_markdown_typogrify_processed_well(text, text2) | |||
| assert "mark" not in html | |||
| assert "reference" not in html | |||
| def test_refer_with_var(self): | |||
| text = """ | |||
| === | |||
| is_processable: False | |||
| === | |||
| <div class="fulltext"> | |||
| {% filter markdown|typogrify %} | |||
| {% mark heading %} | |||
| This is a heading | |||
| ================= | |||
| {% endmark %} | |||
| {% reference content %} | |||
| Hyde & Jinja. | |||
| {% endreference %} | |||
| {% endfilter %} | |||
| </div> | |||
| """ | |||
| text2 = """ | |||
| {% set incu = 'inc.md' %} | |||
| {% refer to incu as inc %} | |||
| {{ inc.html('.fulltext') }} | |||
| """ | |||
| html = assert_markdown_typogrify_processed_well(text, text2) | |||
| assert "mark" not in html | |||