Ich erstelle eine statische Site (kein Blog) mit Jekyll / Liquid. Ich möchte, dass es ein automatisch generiertes Navigationsmenü gibt, das alle vorhandenen Seiten auflistet und die aktuelle Seite hervorhebt. Die Elemente sollten in einer bestimmten Reihenfolge zum Menü hinzugefügt werden. Daher definiere ich eine weight
Eigenschaft in der YAML der Seiten:
---
layout : default
title : Some title
weight : 5
---
Das Navigationsmenü ist wie folgt aufgebaut:
<ul>
{% for p in site.pages | sort:weight %}
<li>
<a {% if p.url == page.url %}class="active"{% endif %} href="{{ p.url }}">
{{ p.title }}
</a>
</li>
{% endfor %}
</ul>
Dadurch werden Links zu allen vorhandenen Seiten erstellt, diese sind jedoch unsortiert. Der sort
Filter scheint ignoriert zu werden. Natürlich mache ich etwas falsch, aber ich kann nicht herausfinden, was.
sort
macht etwas. Wenn eine Site keine bereitstelltweight
, wird sie zuletzt geschrieben. Wenn es jedoch eines bereitstellt, wird es immer noch nicht danach, sondern nach dem Dateinamen sortiert.Antworten:
Seit Jekyll 2.2.0 können Sie ein Array von Objekten nach jeder Objekteigenschaft sortieren. Sie können jetzt tun:
Und sparen Sie viel Bauzeit im Vergleich zur @ kikito-Lösung.
Bearbeiten : Sie MÜSSEN Ihre Sortiereigenschaft als Ganzzahl
weight: 10
und nicht als Zeichenfolge zuweisenweight: "10"
.Das Zuweisen von Sortiereigenschaften als Zeichenfolge führt zu einer Zeichenfolgensortierung wie "1, 10, 11, 2, 20, ...".
quelle
Ihre einzige Option scheint die Verwendung einer Doppelschleife zu sein.
Hässlich wie es ist, sollte es funktionieren. Wenn Sie auch Seiten ohne Gewicht haben, müssen Sie eine zusätzliche interne Schleife einfügen, die nur
{% unless p.weight %}
vor / nach der aktuellen internen Schleife ausgeführt wird .quelle
{%-
%}
Präfix, um leere Zeilen wie erb zu kollabieren.(1..10)
auf diesem Code dargestellten möglichen Gewichte. Es könnte durch ersetzt werden(1..MAX_WEIGHT)
, um es etwas klarer zu machen (und MAX_WEIGHT an einer anderen Stelle definiert zu haben, wie in einer Konstantendatei).Die folgende Lösung funktioniert auf Github (benötigt kein Plugin):
Das obige Snippet sortiert Seiten nach Dateinamen (das
name
Attribut für das Seitenobjekt wird vom Dateinamen abgeleitet). Ich habe Dateien umbenannt, um meiner gewünschten Reihenfolge zu entsprechen :00-index.md
,01-about.md
- und presto! Seiten werden bestellt.Ein Problem ist, dass diese Nummernpräfixe in den URLs landen, was für die meisten Seiten unangenehm aussieht und ein echtes Problem bei 00-index.html darstellt. Permalilnks zur Rettung:
PS Ich wollte schlau sein und benutzerdefinierte Attribute nur zum Sortieren hinzufügen. Leider sind benutzerdefinierte Attribute als Methoden für die Page-Klasse nicht verfügbar und können daher nicht zum Sortieren verwendet werden:
quelle
{% assign sorted_pages = site.pages | sort:"path" %}
und00-directory/00-file.md
würde vor kommen01-anotherDir/00-anotherFile.md
sort:"weight"
funktioniert nur für mich, fyi. Übrigens danke für die hervorragende Lösung.Ich habe ein einfaches Jekyll-Plugin geschrieben, um dieses Problem zu lösen:
Kopieren Sie
sorted_for.rb
von https://gist.github.com/3765912 in das_plugins
Unterverzeichnis Ihres Jekyll-Projekts:sorted_for
anstelle vonfor
withsort_by:property
parameter, um nach der angegebenen Eigenschaft zu sortieren. Sie können auchreversed
genau wie das Original hinzufügenfor
.endsorted_for
.In Ihrem Fall sieht die Verwendung folgendermaßen aus:
quelle
sort_by!
Aufruf ändern , um diese Elemente zu ignorieren:sorted_collection.sort_by! { |i| i.to_liquid[@attributes['sort_by']] || 0 }
(Ersetzen Sie 0 durch unendlich, wenn Sie es umgekehrt möchten).Die einfachste Lösung wäre, dem Dateinamen Ihrer Seiten einen Index wie diesen voranzustellen:
00-home.html 01-services.html 02-page3.html
Die Seiten werden nach Dateinamen sortiert. Jetzt haben Sie jedoch hässliche URLs.
In Ihren Yaml-Front-Materie-Abschnitten können Sie die generierte URL überschreiben, indem Sie die Permalink-Variable festlegen.
Zum Beispiel:
quelle
Einfache Lösung:
Weisen Sie zuerst ein sortiertes Array zu
site.pages
und führen Sie dann eine for-Schleife für das Array aus.Ihr Code sieht folgendermaßen aus:
Dies funktioniert in meiner Navigationsleiste,
_include
die einfach ist:quelle
Liquid Exception: comparison of Hash with Hash failed in _posts/...
Ich habe das mit einem Generator gelöst. Der Generator iteriert über Seiten, ruft die Navigationsdaten ab, sortiert sie und schiebt sie zurück in die Site-Konfiguration. Von dort kann Liquid die Daten abrufen und anzeigen. Es kümmert sich auch darum, Gegenstände zu verstecken und anzuzeigen.
Betrachten Sie dieses Seitenfragment:
Die Navigation wird mit diesem Liquid-Fragment gerendert:
Fügen Sie den folgenden Code in eine Datei in Ihrem _plugins-Ordner ein:
Ich habe eine ganze Weile damit verbracht, das herauszufinden, da ich für Jekyll und Ruby noch ziemlich neu bin. Es wäre also großartig, wenn jemand dies verbessern könnte.
quelle
Ich kann den folgenden Code erhalten, der mit Jekyll / Liquid übereinstimmt und mit Ihrer Anforderung mit Kategorie übereinstimmt:
Darüber zeigt es auch die Anzahl der Beiträge. Alles wird ohne Plug-In erledigt.
Überprüfen Sie es auf unserer Netzwerkseite . Sie können auf einen Beitrag klicken, um die Navigation hervorzuheben, sowie auf einen bestimmten Link, um zur Quellseite zu gelangen, auf der deren Gewicht zugewiesen ist.
quelle
Wenn Sie versuchen, nach Gewicht und Tag zu sortieren und die Anzahl auf 10 zu beschränken, finden Sie hier den folgenden Code:
quelle
Die obige Lösung von @kikito hat auch bei mir funktioniert. Ich habe nur ein paar Zeilen hinzugefügt, um Seiten ohne Gewicht aus der Navigation zu entfernen und Leerzeichen zu entfernen:
quelle