6
votes

I'd like to convert the printed category names of my posts into title case. I couldn't find a Liquid filter that would work. I tried using dashes and the camelcase filter, but no dice.

Alternatively, I'd like to print the category name as it's written in the YAML frontmatter.

For instance, for a post with:

category: Here's the Category

When I reference the name:

{% for cat in site.categories %}
    <h1>{{ cat[0] }}</h1>
{% endfor %}

I see "here's the category" on the page. I would like to see "Here's the Category" or even "Here's The Category," and I could replace (replace: 'The', 'the') the few articles that I wanted to be downcase.

EDIT

For anyone as desperate as I am, this disgusting hack works, where n is the max number of words you have in a category title.

{% for cat in site.categories %}
    {% assign words = cat[0] | split: ' ' %}
    <h1>{{ words[0] | capitalize | replace:'The','the'}} {{ words[1] | capitalize }} {{ words[2] }} {{ words[3] | capitalize }} {{ words[4] | capitalize }} {{ words[n] | capitalize }}</h1>
{% endfor %}

I'm going to leave the question unanswered in case someone knows a more elegant method.

7

7 Answers

6
votes

You can achieve a part of what you want by using the capitalize filter:

Input

{{ 'capitalize me' | capitalize }}

Output

Capitalize me

Source.

Another possibility, which I didn't test for its edge cases, is to use join and camelize:

{{ "here's the category" | join: '-' | camelize }}

It should print "Here's The Category", but camelize might have a problem with here's.

2
votes

Just use {{ category.first | capitalize }} is OK for my case, without additional '' on category.

0
votes

Instead of manually stepping through words 0 to n, one can use another for loop as follows:

{% for category in site.categories %}
  {% assign words = category | first | split: ' ' %}
  {% for word in words %}
    {{ word | capitalize | replace: 'The','the' }}
  {% endfor %}
{% endfor %}
0
votes

I know that this is old but it helped me to solve my problem and it could help others.

The solution I came was:

{% for category in site.categories %}
  <a href="/{{category[0] | slugify }}/">
    {{category[0]}}
  </a>
{% endfor %}  

This list all the blog categories (most used for building a menu)

It turns into:

<a href="/dicas/">
  Dicas
</a>

<a href="/diário-de-bordo/">
  Diário de bordo
</a>

Thank you for giving me a clue. You can check another filters in: http://jekyllrb.com/docs/templates/#filters

0
votes

Name pages in Kabab-case as you want them to appear, then use replace:

{{ category.name | replace: '-', ' '}}

Don't-Capitalize-the becomes Don't Capitalize the and Capitalize-The becomes Capitalize The

0
votes

This solutions is a little more overwrought, but you can adapt the author data file solution from the Jekyll site to work with categories.

In your _data folder, make a file called categories.yml. Put in something like this:

my-first-category:
  name: My First Category

another-category:
  name: Another Category

Then, you can loop through your categories like this:

{% for category in site.categories %}
    {% assign category_slug = category[0] %}
    {% assign category_data = site.data.categories[category_slug] %}
    {% if category_data %}
        {{ category_data.name }}
    {% endif %}
{% endfor %}

Side note: I'm not sure why I needed the category_slug assign. I didn't need it when looping through post.categories.

This increases overhead by adding an extra file, but opens the door for other data that can get attached to objects like a category image or description. You can be more granular over your names. This is a pretty readable solution too, which is nice.

0
votes

I went the other way around. I hard coded my page title in Title case and use downcase, upcase and capitalize liquid filter in other pages.