web-dev-qa-db-fra.com

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

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

50
Mike

En construisant mon propre site, je suis tombé sur le même problème et j'ai trouvé une solution simple et robuste (à mon humble avis). Espérons que cela soit utile pour quiconque souhaite faire quelque chose de similaire.

Le problème

Étant donné un sous-ensemble de pages (pas de messages) sur le site, répertoriez-les sous des en-têtes en fonction de leurs catégories. Par exemple: étant donné un ensemble de pages que nous considérons comme pages resource (ou des pages de référence, ou quel que soit le groupe logique de pages que vous souhaitez afficher), nous voulons 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 ajouter une liste de toutes les catégories/mots-clés/balises (ou le nom de votre choix) qui apparaîtra dans les fichiers de ressources. Voici ce que j'ai dans le mien:

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

Vous pouvez appeler n'importe quelle variable, j'ai choisi 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 correspond à 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 indexer et associer à la page resources.md. Tout ce que vous devez faire est d’ajouter deux variables de fichier en haut de chacun de ces fichiers. La première consiste à indiquer que ce fichier est un fichier resource.

resource: true

La seconde consiste à indiquer les catégories dans lesquelles vous souhaitez que ce fichier soit indexé. Vous pouvez l'indexer dans autant de catégories que vous le souhaitez et, si vous souhaitez une page non indexée, laissez la liste vide. Ma référence pour un traitement EINTR correct en C comprend les catégories suivantes:

categories: [code, unix]

resources.md

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

{% for cat in site.category-list %}
### {{ cat }}
<ul>
  {% for page in site.pages %}
    {% if page.resource == true %}
      {% for pc in page.categories %}
        {% if pc == cat %}
          <li><a href="{{ page.url }}">{{ page.title }}</a></li>
        {% endif %}   <!-- cat-match-p -->
      {% endfor %}  <!-- page-category -->
    {% endif %}   <!-- resource-p -->
  {% endfor %}  <!-- page -->
</ul>
{% endfor %}  <!-- cat -->

Répartition du code

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

  • Parcourez chacune des catégories spécifiées dans _config.yml.
  • Affichez un en-tête avec ce nom de catégorie.
  • Commencez une liste non ordonnée pour les pages appartenant à cette catégorie.
  • Parcourez les pages du site.
  • Si la page est un fichier resource, comme indiqué par la variable de fichier resource, affichez un lien vers cette page pour chacune des catégories auxquelles le fichier appartient.

Remarque: les variables category-list dans _config.yml et categories dans les fichiers de ressources peuvent être appelées comme vous le souhaitez. Assurez-vous simplement que vous utilisez les mêmes variables dans le fichier générant 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 un certain 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 viens de mettre cela ensemble aujourd'hui, donc au moment d'écrire ces lignes, il est loin d'être terminé, mais vous pouvez consulter ma biographie si vous le souhaitez. page d'accueil.

J'espère que cela t'aides!

81
m-renaud

Il y a une façon plus propre de faire cela en utilisant le liquide "contient" la propriété 

sur _config.yml ajouter votre index de catégories

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

sur votre page.md à l’intérieur de la matière avant, ajoutez une ou plusieurs des catégories disponibles dans _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 de la catégorie de fruits que vous faites:

{% for page in site.pages %}
  {% if page.categories contains 'fruit' %}
    <div class="item">
      <h3>{{page.title}}</h3>
      <p>{{page.description}}</p>  
    </div>
  {% endif %}
{% endfor %}
15
felipesk

Vous devriez faire la différence entre les pages et les articles (articles). La liste de tous les articles triés par catégorie ne pose aucun problème. Vous pouvez parcourir les catégories du site, qui contiennent le nom de la catégorie et une liste de tous les articles de cette catégorie.

Lister toutes les pages est également possible, vous pouvez parcourir site.pages. Mais une page n'appartient pas à une catégorie spécifique (seuls les messages appartiennent). 

Lorsque je jette un coup d'œil à votre exemple posté, utiliser des catégories dans des publications, puis parcourir en boucle les catégories de site semble être la voie à suivre. Vous obtiendrez exactement le résultat souhaité.

2
Polygnome

Quelques variantes/simplifications sont possibles (réponse de felipesk). Peut-être en raison des améliorations apportées à Jekyll.

Il faut NO index nécessaire dans _config.yml.

Si la liste des pages est non répertoriée dans une page _ mais par exemple dans un doc, vous pouvez également ajouter 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 }})
        <small>{{ p.excerpt }}</small>
   {% 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 }})  
      <small>{{ post.excerpt }}</small>
{% endfor %}

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

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

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

Je travaille avec le thème Minimal Mistakes

0
pme