Trier ses tags avec Zola

Quand j’ai testé Zola pour la première fois, j’avais un soucis avec le tri des tags : les accents étaient mal gérés, et je me retrouvais avec « écriture » derrière « zola », ce qui fait un peu désordre (haha). Mais j’ai enfin trouvé le moyen de contourner le soucis !

J’avais en tête de trouver le moyen de classer les tags dans leur version sans accent, la version dite « slug ». Pour la page qui liste tous les tags, on a accès au slug facilement :

{% set all_tags = terms | sort(attribute="slug") %}

Par contre, pour les tags affichés dans l’en-tête d’un article, c’est un peu plus compliqué. En effet, les slugs des tags ne sont pas disponibles lors du rendu d’une page. On peut transformer ce qu’on veut en slug avec le filtre slugify mais il faut trouver un moyen de garder le lien entre le mot original et le slug, pour trier selon ce dernier et afficher le mot avec accent à la bonne place.

Après quelques tâtonnements, j’ai réussi grâce à une macro (une feature de Zola) :

1. {% macro print_tags(page) %}
2. {% set_global tags = [] %}
3. {% for t in page.taxonomies["tags"] %}
4. {% set s = t | slugify %}
5. {% set expanded_obj = '{ "slug": "' ~ s ~ '", "tag": "' ~ t ~ '" }' %}
6. {% set obj = load_data(literal=expanded_obj, format="json") %}
7. {% set_global tags = tags | concat(with=obj) %}
8. {% endfor %}
9. {% for tag in tags | sort(attribute="slug") %}
10. <a href="/tags/{{ tag['slug'] }}" class="tag">{{ tag['tag'] }}</a>{% if not loop.last %}, {% endif %}
11. {% endfor %}
12. {% endmacro print_tags %}

Je décortique un peu :

  1. La première ligne déclare la macro, son nom et son paramètre
  2. Je défini ensuite un objet global tags
  3. Pour chaque tag présents dans la page :
  4. J’applique le filtre slugify dessus
  5. Je construit un JSON décrivant un objet avec un slug son tag associé
  6. Je construit un objet en chargeant le JSON
  7. J’ajoute cet objet dans ma globale tags de la ligne 2
  8. fin de boucle
  9. Pour chaque objet dans tags qui est trié selon son champs slug :
  10. J’affiche le champs tag correspondant dans un HTML <a> pour qu’il soit cliquable, et si ce n’est pas le dernier objet, j’ajoute une virgule
  11. fin de boucle
  12. fin de macro

La partie difficile fût de découvrir la fonction load_data pour construire ses propres objets décrits par un JSON. Cette feature a été ajoutée relativement récemment, le 21 Mars 2022, du coup, c’est un coup de chance que je peux désormais utiliser Zola pour le blog !