This is a nifty one.

I wanted to create manual categories for my coding posts, so I ended up doing something like this in my coding/index.html (a simplified excerpt):

<div>
  <h3>Ruby</h3>
  <ul>
    {% for post in site.posts %}
      {% if post.categories contains "ruby" %}
        {{ post.title }}
      {% endif %}
    {% endfor %}
  </ul>

  <h3>Javascript</h3>
  <ul>
    {% for post in site.posts %}
      {% if post.categories contains "javascript" %}
        {{ post.title }}
      {% endif %}
    {% endfor %}
  </ul>

  <h3>Erlang</h3>
  <ul>
    {% for post in site.posts %}
      {% if post.categories contains "erlang" %}
        {{ post.title }}
      {% endif %}
    {% endfor %}
  </ul>

  <!-- and so on -->
</div>

… which was really ripe for DRYing up. The problem was that the partial would need to accept a parameter of some sort (for the category name). The official Liquid documentation leaves much to be desired, but there’s a tiny part in the Templates section of the Jekyll documentation that saved the day:

You can also pass parameters to an include. Omit the quotation marks to send a variable’s value. Liquid curly brackets should not be used here:

{% include footer.html param="value" variable-param=page.variable %}

These parameters are available via Liquid in the include:

{{ include.param }}

So I abstracted the above into a partial, naturally so:

<!-- _includes/post-category.html -->
<h3>{{ include.name | capitalize }}</h3>
<ul>
  {% for post in site.posts %}
    {% if post.categories contains include.name %}
      {{ post.title }}
    {% endif %}
  {% endfor %}
</ul>

and the resulting index.html:

<div>
  {% include post-category.html name="ruby" %}
  {% include post-category.html name="javascript" %}
  {% include post-category.html name="erlang" %}  
</div>

Neato!