Jekyllを(ブログではなく)Webサイトの静的ジェネレーターとして使用しており、インデックスページのすべてのページの自動生成リストが必要です。具体的には、さまざまなカテゴリを作成し、各カテゴリのすべての記事を個別に一覧表示します。 ここにあります 以下に問題がある場合、私が説明している例。 Jekyllでこれを行う方法はありますか(GitHubページなど)? 変数のドキュメントページ を見ましたが、それはブログ投稿形式に固有のようです。
自分のサイトを構築しているときに、これとまったく同じ問題に遭遇し、(IMHO)簡単で堅牢なソリューションを見つけました。うまくいけば、これは似たようなことをしたい他の人にとって便利です。
サイト上のページのサブセット(投稿ではない)を指定し、カテゴリに基づいて見出しの下にリストします。例:resourceページ(または参照ページ、または表示したいページの論理的なグループ化)とみなされる一連のページがある場合、それらをカテゴリ(コード、説明など)の下にリストしたいと思います。
目的の動作を得るには、次の3つの場所で変更を行う必要があります。
_config.yml
resources.md
resource-file-X.md
_config.yml
_config.yml
には、リソースファイルに表示されるすべてのカテゴリ/キーワード/タグ(またはそれを呼び出すもの)のリストを追加する必要があります。ここに私が持っているものがあります:
category-list: [code, editors, math, unix]
変数は何でも呼び出すことができます。category-list
を選択しました。resource.md
ファイルで同じ変数を使用していることを確認してください。
注:リストに項目を配置する順序は、resource.md
ページにリストされる順序です。
resource-file-X.md
これらは、resources.md
ページでインデックスを作成してリンクするファイルです。必要なのは、これらの各ファイルの先頭に2つのファイル変数を追加することだけです。 1つ目は、このファイルがresourceファイルであることを示すことです。
resource: true
2つ目は、このファイルにインデックスを付けるカテゴリを指定することです。必要な数のカテゴリでインデックスを作成できます。ページのインデックスを作成しない場合は、リストを空白のままにします。 Cでの適切なEINTR処理に関する私のリファレンスには、次のカテゴリがあります。
categories: [code, unix]
resources.md
これは、それぞれのカテゴリに基づいてページのリストを生成するファイルです。必要なのは、このファイル(またはリストに含める任意のファイル)に次のコードを追加することだけです。
{% 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 -->
この仕組みの簡単な説明:
_config.yml
で指定された各カテゴリをループします。resource
で示されるresourceファイルである場合、ファイルが属する各カテゴリに対して、それらのいずれかがリストされている現在のカテゴリと一致する場合、そのページへのリンクを表示します。注:リソースファイルのcategory-list
およびcategories
の変数_config.yml
は、何でも好きなように呼び出すことができます。リストを生成するファイル内の変数
別の注意:_config.yml
を変更する場合、Jekyllを完全に再起動する必要があります。たとえ--watch
オプションを使用していても、停止して再起動する必要があります。変更が有効にならない理由を理解するのに少し時間がかかりました!
最終製品は my site のリソースページで見ることができますが、今日はこれをまとめただけなので、この記事の執筆時点では完全にはほど遠いですが、ホームページにしたい。
お役に立てれば!
液体の「含む」プロパティを使用してこれを行うよりクリーンな方法があります
categories: [fruit, meat, vegetable, cheese, drink]
---
layout: page
title: Orange juice
description: Orange juice is juice from oranges. It's made by squeezing oranges.
categories: [fruit, drink]
---
{% for page in site.pages %}
{% if page.categories contains 'fruit' %}
<div class="item">
<h3>{{page.title}}</h3>
<p>{{page.description}}</p>
</div>
{% endif %}
{% endfor %}
ページと投稿(記事)を区別する必要があります。カテゴリー別にソートされたすべての投稿をリストすることは全く問題ではありません。 site.categoriesをループできます。これには、カテゴリ名とそのカテゴリ内のすべての投稿のリストが含まれています。
すべてのページをリストすることも可能です。site.pagesをループすることができます。ただし、ページは特定のカテゴリに属していません(投稿のみが属します)。
投稿された例を見てみると、投稿にカテゴリを使用してから、site.categoriesをループするのが方法のようです。正確に目的の出力が得られます。
いくつかのバリエーション/単純化が可能です(フェリペスクの回答)。たぶん、ジキルの改善による。
_config.yml
にはNOインデックスが必要です。
ページのリストがページにリストされていないであるが、例えばドキュメントにある場合、ドキュメントにもカテゴリを追加できます。
---
layout: doc
title: Fruit List
categories: [fruit]
---
そして、次のように使用します:
{% for p in site.pages %}
{% if p.categories contains page.category %}
* [{{ p.title }}]({{ p.url | absolute_url }})
<small>{{ p.excerpt }}</small>
{% endif %}
{% endfor %}
投稿では、これはさらに短くなる可能性があります。
{% for post in site.categories[page.category] %}
* [{{ post.title }}]({{ post.url | absolute_url }})
<small>{{ post.excerpt }}</small>
{% endfor %}
なぜこれが投稿にしか機能しないのか、私にはまだわかりませんでした。
興味深い点は、このスニペットはどこでも使用できることです(docs/pages/postsを混在させる場合)!したがって、それを_includes
として追加し、次のように使用します。
## Further Reading
{% include pages-list.md %}
私はテーマを使用しています Minimal Mistakes