it-swarm.com.de

Generieren einer Liste von Seiten (nicht Beiträgen) in einer bestimmten Kategorie

Ich verwende Jekyll als statischen Generator für eine Website (kein Blog) und möchte eine automatisch generierte Liste aller Seiten auf meiner Indexseite haben. Insbesondere möchte ich unterschiedliche Kategorien haben und alle Artikel in jeder Kategorie separat auflisten. Hier ist ein Beispiel von dem, was ich beschreibe, wenn du Schwierigkeiten hast zu folgen. Gibt es eine Möglichkeit, dies in Jekyll zu tun (z. B. GitHub-Seiten)? Ich habe die variables Dokumentationsseite gesehen aber das scheint spezifisch für das Blogpost-Format zu sein.

50
Mike

Beim Erstellen meiner eigenen Website bin ich auf dasselbe Problem gestoßen und habe eine (IMHO) einfache und robuste Lösung gefunden. Hoffentlich ist dies nützlich für alle anderen, die etwas Ähnliches tun möchten.

Das Problem

Listen Sie eine bestimmte Anzahl von Seiten (keine Beiträge) auf der Website auf, und geben Sie sie nach ihren Kategorien an. Zum Beispiel: Wenn wir eine Reihe von Seiten betrachten, die resource -Seiten (oder Referenzseiten oder welche logische Gruppierung der Seiten, die Sie anzeigen möchten) sind, möchten wir sie unter ihren Kategorien auflisten (z. B. Code, Erläuterung) , und so weiter).

Die Lösung

Um das gewünschte Verhalten zu erhalten, müssen wir an drei Stellen Änderungen vornehmen:

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

_config.yml

In _config.yml müssen wir eine Liste aller Kategorien/Schlüsselwörter/Tags (oder wie auch immer Sie es nennen möchten) hinzufügen, die in den Ressourcendateien angezeigt werden. Folgendes habe ich in meinem:

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

Sie können die Variable beliebig aufrufen. Ich habe category-list gewählt. Stellen Sie nur sicher, dass Sie dieselbe Variable in der resource.md-Datei verwenden.

Hinweis: Die Reihenfolge, in der Sie die Elemente in der Liste platzieren, ist die Reihenfolge, in der sie auf der Seite resource.md aufgeführt werden.

resource-file-X.md

Dies sind die Dateien, die Sie auf der Seite resources.md indizieren und verknüpfen möchten. Sie müssen lediglich zwei Dateivariablen oben in jeder dieser Dateien hinzufügen. Die erste besteht darin, anzuzeigen, dass es sich bei dieser Datei um eine resource -Datei handelt.

resource: true

Die zweite ist, anzugeben, unter welchen Kategorien diese Datei indiziert werden soll. Sie können sie unter beliebig vielen Kategorien indizieren. Wenn Sie eine Seite nicht indizieren möchten, lassen Sie die Liste leer. Meine Referenz für die ordnungsgemäße EINTR-Behandlung in C hat die folgenden Kategorien:

categories: [code, unix]

resources.md

Dies ist die Datei, die die Liste der Seiten basierend auf ihren jeweiligen Kategorien generiert. Sie müssen lediglich den folgenden Code zu dieser Datei hinzufügen (oder zu welcher Datei auch immer die Liste gehören soll):

{% 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 -->

Code-Aufschlüsselung

Nur eine kurze Erklärung, wie das funktioniert:

  • Durchlaufen Sie jede der in _config.yml angegebenen Kategorien.
  • Zeigt eine Überschrift mit diesem Kategorienamen an.
  • Starten Sie eine ungeordnete Liste für die Seiten, die zu dieser Kategorie gehören.
  • Blättern Sie durch die Seiten der Site.
  • Wenn es sich bei der Seite um eine resource -Datei handelt, wie durch die Dateivariable resource angegeben, zeigen Sie für jede der Kategorien, zu denen die Datei gehört, wenn eine von ihnen der aktuell aufgelisteten Kategorie entspricht, einen Link zu dieser Seite an.

Hinweis: Die Variablen category-list in _config.yml und categories in den Ressourcendateien können nach Belieben aufgerufen werden. Vergewissern Sie sich, dass Sie die gleichen Variablen in der Datei verwenden, in der die Liste erstellt wird.

Noch ein Hinweis: Wenn Sie _config.yml ändern, müssen Sie Jekyll vollständig neu starten. Selbst wenn Sie die --watch-Option haben, müssen Sie sie stoppen und erneut starten. Ich habe eine Weile gebraucht, um herauszufinden, warum meine Änderungen nicht wirksam wurden!

Das Endprodukt

Sie können das Endprodukt auf der Ressourcenseite auf my site sehen. Obwohl ich dies gerade heute zusammengestellt habe, ist es bei diesem Schreiben alles andere als abgeschlossen, aber Sie können meine Biografie überprüfen, wenn Sie möchten Startseite.

Hoffe das hilft!

81
m-renaud

Es gibt einen saubereren Weg, dies zu tun, indem flüssige "enthält" -Eigenschaften verwendet werden 

fügen Sie in _config.yml Ihren Index der Kategorien hinzu

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

fügen Sie auf Ihrer page.md in der Startseite eine oder mehrere der in der _config.yml verfügbaren Kategorien hinzu

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

auf Ihrer Vorlage, um alle Seiten in der Obstkategorie zu erhalten, die Sie tun:

{% 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

Sie sollten zwischen Seiten und Beiträgen (Artikeln) unterscheiden. Alle Beiträge nach Kategorien sortiert anzuzeigen, ist überhaupt kein Problem. Sie können site.categories durchlaufen, es enthält den Kategorienamen und eine Liste aller Beiträge in dieser Kategorie.

Das Auflisten aller Seiten ist ebenfalls möglich, Sie können Site.pages auch durchlaufen. Eine Seite gehört jedoch nicht zu einer bestimmten Kategorie (nur Beiträge tun dies). 

Wenn ich mir Ihr veröffentlichtes Beispiel ansehe, scheint die Verwendung von Kategorien in Beiträgen und das Durchlaufen von site.categories der richtige Weg zu sein. Sie erhalten genau die gewünschte Ausgabe.

2
Polygnome

Es sind einige Variationen/Vereinfachungen möglich (Antwort von Felipesk). Möglicherweise aufgrund von Verbesserungen in Jekyll.

In _config.yml ist NO-Index erforderlich.

Wenn die Liste der Seiten nicht in einer Seite aufgeführt ist, aber beispielsweise in einem Dokument, können Sie die Kategorie auch dem Dokument hinzufügen:

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

Und benutze es dann so:

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

Bei Beiträgen kann dies noch kürzer sein:

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

Warum das nur für Posts funktioniert, konnte ich noch nicht herausfinden.

Das Interessante ist, dass dieses Snippet überall verwendet werden kann (wenn Sie docs/pages/posts).! Fügen Sie es einfach als _includes hinzu und verwenden Sie es wie folgt:

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

Ich arbeite mit dem Thema Minimal Fehler

0
pme