@@ -4,6 +4,7 @@ Contains classes and utilities related to tagging | |||
resources in hyde. | |||
""" | |||
import re | |||
from hyde.fs import File, Folder | |||
from hyde.model import Expando | |||
from hyde.plugin import Plugin | |||
from hyde.site import Node, Resource | |||
@@ -58,16 +59,19 @@ class TaggerPlugin(Plugin): | |||
tagger: | |||
sorter: kind # How to sort the resources in a tag | |||
archives: | |||
template: tagged_posts.j2 | |||
target: tags | |||
archive_extension: html | |||
blog: | |||
template: tagged_posts.j2 | |||
source: blog | |||
target: blog/tags | |||
archive_extension: html | |||
""" | |||
def __init__(self, site): | |||
super(TaggerPlugin, self).__init__(site) | |||
def begin_site(self): | |||
""" | |||
Initialize plugin. Add tag to the site context variable. | |||
Initialize plugin. Add tag to the site context variable | |||
and methods for walking tagged resources. | |||
""" | |||
self.logger.debug("Adding tags from metadata") | |||
@@ -92,4 +96,45 @@ class TaggerPlugin(Plugin): | |||
else: | |||
tags[tag].append(resource) | |||
self.site.tagger = Expando(dict(tags=tags)) | |||
self.site.tagger = Expando(dict(tags=tags)) | |||
def site_complete(self): | |||
""" | |||
Generate archives. | |||
""" | |||
content = self.site.content | |||
archive_config = None | |||
try: | |||
archive_config = attrgetter("tagger.archives")(self.site.config) | |||
except AttributeError: | |||
return | |||
self.logger.debug("Generating archives for tags") | |||
for name, config in archive_config.to_dict().iteritems(): | |||
if not 'template' in config: | |||
raise self.template.exception_class( | |||
"No Template sepecified in tagger configuration.") | |||
source = content.node_from_relative_path(config.get('source', '')) | |||
target = self.site.config.deploy_root_path.child_folder( | |||
config.get('target', 'tags')) | |||
extension = config.get('extension', 'html') | |||
if not target.exists: | |||
target.make() | |||
template = config['template'] | |||
text = "{%% extends \"%s\" %%}" % template | |||
for tag, resources in self.site.tagger.tags.to_dict().iteritems(): | |||
archive_text = self.template.render(text, dict( | |||
site=self.site, | |||
node=source, | |||
walker=getattr(source, | |||
"walk_resources_tagged_with_%s" % tag) | |||
)) | |||
archive_file = File(target.child("%s.%s" % (tag, extension))) | |||
archive_file.write(archive_text) |
@@ -65,26 +65,52 @@ class TestTagger(object): | |||
assert len(sad_thought_posts) == 1 | |||
assert "sad-post.html" in sad_thought_posts | |||
def test_tagger_archives_generated(self): | |||
gen = Generator(self.s) | |||
gen.load_site_if_needed() | |||
gen.load_template_if_needed() | |||
gen.generate_all() | |||
tags_folder = self.deploy.child_folder('blog/tags') | |||
assert tags_folder.exists | |||
tags = ['sad', 'happy', 'angry', 'thoughts', 'events'] | |||
archives = (File(tags_folder.child("%s.html" % tag)) for tag in tags) | |||
for archive in archives: | |||
assert archive.exists | |||
from pyquery import PyQuery | |||
q = PyQuery(File(tags_folder.child('sad.html')).read_all()) | |||
assert q | |||
assert q('li').length == 2 | |||
assert q('li a:first-child').attr('href') == '/blog/another-sad-post.html' | |||
assert q('li a:eq(1)').attr('href') == '/blog/sad-post.html' | |||
q = PyQuery(File(tags_folder.child('happy.html')).read_all()) | |||
assert q | |||
assert q('li').length == 1 | |||
assert q('li a:first-child').attr('href') == '/blog/happy-post.html' | |||
q = PyQuery(File(tags_folder.child('angry.html')).read_all()) | |||
assert q | |||
assert q('li').length == 1 | |||
assert q('li a:first-child').attr('href') == '/blog/angry-post.html' | |||
q = PyQuery(File(tags_folder.child('thoughts.html')).read_all()) | |||
assert q | |||
assert q('li').length == 3 | |||
assert q('li a:eq(0)').attr('href') == '/blog/happy-post.html' | |||
assert q('li a:eq(1)').attr('href') == '/blog/angry-post.html' | |||
assert q('li a:eq(2)').attr('href') == '/blog/sad-post.html' | |||
q = PyQuery(File(tags_folder.child('events.html')).read_all()) | |||
assert q | |||
# def test_tagger_archives_generated(): | |||
# gen = Generator(self.s) | |||
# gen.load_site_if_needed() | |||
# gen.load_template_if_needed() | |||
# gen.generate_all() | |||
# tags_folder = self.deploy.child_folder('blog/tags') | |||
# | |||
# blog_node = self.s.node_from_relative_path('blog') | |||
# res_by_tag = | |||
# for resource in blog_node.walk_resources(): | |||
# | |||
# | |||
# assert tags_folder.exists | |||
# tags = ['sad', 'happy', 'angry', 'thoughts'] | |||
# | |||
# archives = (File(tags_folder.child("%s.html" % tag)) for tag in tags) | |||
# for archive in archives: | |||
# assert archive.exists | |||
# assert | |||
assert q('li').length == 1 | |||
assert q('li a:first-child').attr('href') == '/blog/another-sad-post.html' |
@@ -1,9 +1,8 @@ | |||
{% if tag and tag.resources -%} | |||
<h1>Posts tagged: {{ tag }} in {{ node.name|title }}</h1> | |||
<ul> | |||
{% for resource in tag.resources -%} | |||
{% for resource in walker() -%} | |||
<li> | |||
<a href="{{ content_url(resource.url) }}">{{ resource.meta.title }}</a> | |||
</li> | |||
{%- endfor %} | |||
</ul> | |||
{%- endif %} | |||
</ul> |