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 :
- La première ligne déclare la macro, son nom et son paramètre
- Je défini ensuite un objet global
tags
- Pour chaque tag présents dans la page :
- J’applique le filtre
slugify
dessus - Je construit un JSON décrivant un objet avec un
slug
sontag
associé - Je construit un objet en chargeant le JSON
- J’ajoute cet objet dans ma globale
tags
de la ligne 2 - fin de boucle
- Pour chaque objet dans
tags
qui est trié selon son champsslug
: - 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 - fin de boucle
- 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 !