Générer une liste de pages (pas de messages) dans une catégorie donnée

J’utilise Jekyll comme générateur statique pour un site Web (pas un blog), et je souhaite avoir une liste générée automatiquement de toutes les pages de ma page d’index. Plus précisément, je souhaite avoir différentes catégories et répertorier tous les articles de chaque catégorie séparément. Voici un exemple de ce que je décris si vous avez des difficultés à suivre. Est-il possible de le faire dans Jekyll (par exemple, les pages GitHub)? J’ai vu la page de documentation des variables mais cela semble spécifique au format de l’article de blog.

En construisant mon propre site, je suis tombé sur le même problème et j’ai trouvé une solution simple et robuste (IMHO). J’espère que cela est utile pour quiconque souhaite faire quelque chose de similaire.

Le problème

Étant donné un sous-ensemble de pages (et non de publications) sur le site, répertoriez-les sous des rubriques en fonction de leurs catégories. Par exemple: pour un ensemble de pages que nous considérons comme des pages de ressources (ou des pages de référence, ou quelque regroupement logique de pages que vous souhaitez afficher), nous souhaitons les répertorier sous leurs catégories (ex. Code, explication, etc.) .

La solution

Pour obtenir le comportement que nous voulons, nous devons apporter des modifications à trois endroits:

  • _config.yml
  • resources.md
  • resource-file- X .md

_config.yml

Dans _config.yml , nous devons append une liste de toutes les catégories / mots-clés / balises (ou tout ce que vous voulez l’appeler) qui apparaîtront dans les fichiers de ressources. Voici ce que j’ai dans le mien:

 category-list: [code, editors, math, unix] 

Vous pouvez appeler la variable n’importe quoi, j’ai choisi la category-list , assurez-vous simplement que vous utilisez la même variable dans le fichier resource.md .

Remarque: L’ordre dans lequel vous placez les éléments dans la liste est l’ordre dans lequel ils seront répertoriés sur la page resource.md .

resource-file- X .md

Ce sont les fichiers que vous souhaitez avoir indexés et liés à la page resources.md . Il vous suffit d’append deux variables de fichier en haut de chacun de ces fichiers. La première consiste à indiquer que ce fichier est un fichier de ressources .

 resource: true 

La seconde consiste à indiquer sous quelles catégories vous souhaitez que ce fichier soit indexé. Vous pouvez l’indexer sous autant de catégories que vous le souhaitez, et si vous souhaitez qu’une page ne soit pas indexée, laissez la liste vide. Ma référence pour une gestion correcte de EINTR en C comprend les catégories suivantes:

 categories: [code, unix] 

resources.md

C’est le fichier qui va générer la liste des pages en fonction de leurs catégories respectives. Tout ce que vous avez à faire est d’append le code suivant à ce fichier (ou le fichier sur lequel vous souhaitez que la liste soit active):

 {% for cat in site.category-list %} ### {{ cat }} 
    {% for page in site.pages %} {% if page.resource == true %} {% for pc in page.categories %} {% if pc == cat %}
  • {{ page.title }}
  • {% endif %} {% endfor %} {% endif %} {% endfor %}
{% endfor %}

Répartition du code

Juste une explication rapide de la façon dont cela fonctionne:

  • Boucle à travers chacune des catégories spécifiées dans _config.yml .
  • Affiche un en-tête avec ce nom de catégorie.
  • Démarrer une liste non ordonnée pour les pages appartenant à cette catégorie.
  • Parcourez les pages du site.
  • Si la page est un fichier de ressources comme indiqué par la resource variable de fichier, pour chaque catégorie à laquelle appartient le fichier, si l’une d’entre elles correspond à la catégorie en cours d’affichage, affichez un lien vers cette page.

Note: les variables category-list des category-list dans _config.yml et les categories dans les fichiers de ressources peuvent être appelées comme vous voulez, assurez-vous simplement que vous utilisez les mêmes variables dans le fichier qui génère la liste.

Autre remarque: lorsque vous modifiez _config.yml , vous devez redémarrer complètement Jekyll, même si vous avez l’option --watch , vous devez l’arrêter et le redémarrer. Il m’a fallu du temps pour comprendre pourquoi mes changements ne prenaient pas effet!

Le produit final

Vous pouvez voir le produit final sur la page des ressources sur mon site , même si je rassemble tout cela aujourd’hui. Au moment d’écrire ces lignes, c’est loin d’être complet, mais vous pouvez consulter ma biographie si vous voulez sur la page d’accueil.

J’espère que cela t’aides!

Il existe un moyen plus propre de le faire en utilisant la propriété “contient” liquide

sur _config.yml ajoutez votre index des catégories

 categories: [fruit, meat, vegetable, cheese, drink] 

sur votre page.md dans la partie frontale, ajoutez une ou plusieurs des catégories disponibles dans le fichier _config.yml

 --- layout: page title: Orange juice description: Orange juice is juice from oranges. It's made by squeezing oranges. categories: [fruit, drink] --- 

sur votre modèle pour obtenir toutes les pages dans la catégorie de fruits que vous faites:

 {% for page in site.pages %} {% if page.categories contains 'fruit' %} 

{{page.title}}

{{page.description}}

{% endif %} {% endfor %}

Vous devez différencier les pages et les articles (articles). La liste de tous les messages classés par catégorie ne pose aucun problème. Vous pouvez parcourir en boucle site.categories, il contient le nom de la catégorie et une liste de tous les articles de cette catégorie.

La liste de toutes les pages est également possible, vous pouvez parcourir en boucle site.pages. Mais une page n’appartient pas à une catégorie spécifique (seuls les messages le font).

Lorsque je jette un coup d’œil à votre exemple affiché, l’utilisation de catégories sur les publications et la mise en boucle de sites.categories semblent être la solution. Cela vous donnera exactement la sortie désirée.

Il y a quelques variantes / simplifications possibles (réponse de felipesk). Peut-être en raison des améliorations apscopes à Jekyll.

Il n’y a pas d’index nécessaire dans _config.yml .

Si la liste des pages ne figure pas dans une page mais par exemple dans un doc, vous pouvez également append la catégorie à la doc:

 --- layout: doc title: Fruit List categories: [fruit] --- 

Et puis utilisez-le comme ceci:

 {% for p in site.pages %} {% if p.categories contains page.category %} * [{{ p.title }}]({{ p.url | absolute_url }}) {{ p.excerpt }} {% endif %} {% endfor %} 

Avec les messages, cela peut même être plus court:

 {% for post in site.categories[page.category] %} * [{{ post.title }}]({{ post.url | absolute_url }}) {{ post.excerpt }} {% endfor %} 

Pourquoi cela ne fonctionne que pour les postes, je ne pouvais pas encore comprendre.

Le point intéressant est que cet extrait peut être utilisé partout ( si vous mélangez documents / pages / messages )! Il suffit donc de l’append en tant que _includes et de l’utiliser comme:

 ## Further Reading {% include pages-list.md %} 

Je travaille avec le thème Minimal Mistakes