Add support for tags to Cobalt
A while back I started adding a new front matter attribute to all my posts
called tags
. I initially did this to improve my site search indexing (you can
read about that here).
After spending some time thinking about how to add tags to the site, and I think I've come up with a reasonable solution.
The biggest problem with tags is that you can't easily codegen the template like the one I used for the documents collection feed to seed the lunr indexer.
The code for the tag template looks like this.
</ul>
{% endfor %}
{% endfor %}
{% endif %}
{% break %}</a></li>
{{ post.title }}">{{post.permalink }}
<li><a href="/{% if tag == filter_tag %}
{% for tag in tags %}
{% assign tags = post.data.tags | replace: " ", "" | split: "," %}
{% for post in collections.posts.pages reversed %}</h1>
<ul>
{{ filter_tag }}
<h1>Posts tagged as
The code is fairly trivially, grab the tags
attribute turn it into an array
of tags and then loop over it and add a link if the tag is found.
If you were to create a template per tag, there's a risk of code duplication. After that, it's only a matter of time, when you "fix" one template, but forget apply to the others.
You could mitigate against this by recreating all the tag pages at build time. I may revisit this solution at a later date to see if there's any other benefits that might have been overlooked.
In the end I decided to use the include
liquid tag to reuse the tag template
code, again I got the idea from Johann's excellent blog
where he broke up his default layout into components using include
. One thing
to note about using the include
tag is that you shouldn't include a front
matter section otherwise this will also be rendered.
tags/cobalt.liquid
front matter
extends: default.liquid
title: booyaa's boggy bloggy
path: tags/cobalt/
comment: collection of cobalt related posts
---
The only item of note here is the path, I've decided to utilise tags
as a
sub-path. I've not created a index page for this sub-path, so it'll give a 404
for now.
content
{% include "_tag.liquid" %}
{% assign filter_tag = "cobalt" %}
The tag page content literally define the tag filter that will be used by the
tags
template and then includes the tags
template.
The end result can be found here. I should add that, I'm still thinking about a way to add this link within related posts, but I think that's another problem altogether! The source code can be found here.