Archives in Jekyll

After setting up the RSS feed, the next thing I wanted to add to mitsake was a set of 'proper' archives by both date and tag rather than just the reverse chronological list of posts. Although this wasn't as straightforward as setting up RSS, a bit of searching turned up some sites that helped me get everything running.

Tags

Although there's built-in support for tags in Jekyll, there isn't an easy way to access them via Liquid. Fortunately, the Jekyll wiki has links to a number of useful plugins including Jose Gonzales' Generic Blog Plugins. The one I'm using is iterator.rb, which gives a new set of template data accessible from site.iterable.tags (as well as site.iterable.categories if you're using them instead). Once the plugin was installed, I used Liquid to access the tags along with their names and the posts filed under that tag.

{% for tag in site.iterable.tags %}
<h3>{{ tag.name }}</h3>
<ul>
    {% for post in tag.posts %}
        <li><a href="{{ post.url }}">{{ post.title }}</a></li>
        <time>{{ post.date | date: "%e %B %Y" }}</time>
    {% endfor %}
</ul>
{% endfor %}

Archiving by date

Because a list of posts in reverse chronological order can be readily accessed in Jekyll through site.posts, all that's needed is to use some clever Liquid markup to process it. I found a good example by Mike Rowe he made to group his archives by year which I adapted slightly to allow my archives to be broken down by month.

{% for post in site.posts %}
    {% capture month %}{{ post.date | date: '%m%Y' }}{% endcapture %}
    {% capture nmonth %}{{ post.next.date | date: '%m%Y' }}{% endcapture %}
        {% if month != nmonth %}
            {% if forloop.index != 1 %}</ul>{% endif %}
            <h3>{{ post.date | date: '%B %Y' }}</h3><ul>
        {% endif %}
    <li><a href="{{ post.url }}">{{ post.title }}</a></li>
    <time>{{ post.date | date: "%e %B %Y" }}</time>
{% endfor %}

The above code uses the {% capture %} tag to get the month and year of each post and the one that follows it before comparing them. If they're different, the month and year are inserted before a link to the post while if they're the same, the post is simply added to the list for that month. The only tricky bit I ran into was closing the <ul> tag at the end of each month's list. After checking out the Liquid documentation my solution was to close the tag before each header, excluding the first by using forloop.index.

That's about it! Hopefully this is a useful reference for anyone that's looking to make their Jekyll archives a bit more accessible.