jekyll - pages - Generar una lista de páginas(no publicaciones) en una categoría determinada
jekyll with bundle (4)
Estoy usando Jekyll como un generador estático para un sitio web (no un blog), y quiero tener una lista generada automáticamente de todas las páginas en mi página de índice. Específicamente, quiero tener diferentes categorías y enumerar todos los artículos en cada categoría por separado. Here''s un ejemplo de lo que estoy describiendo, si tiene problemas para seguir. ¿Hay alguna forma de hacer esto en Jekyll (por ejemplo, páginas de GitHub)? He visto la página de documentación de variables pero parece específica para el formato de publicación de blog.
Debe diferenciar entre páginas y publicaciones (artículos). Listar todas las publicaciones ordenadas por categoría no es ningún problema. Puede recorrer loop en site.categories, contiene el nombre de la categoría y una lista de todas las publicaciones en esa categoría.
También es posible listar todas las páginas, puede recorrer las páginas del sitio. Pero una página no pertenece a una categoría específica (solo las publicaciones lo hacen).
Cuando eche un vistazo a su ejemplo publicado, usar categorías en las publicaciones y luego recorrer las categorías del sitio parece ser el camino a seguir. Le conseguirá exactamente la salida deseada.
Existen algunas variaciones / simplificaciones posibles (respuesta de felipesk). Tal vez debido a las mejoras en Jekyll.
NO se necesita índice en _config.yml
.
Si la lista de páginas no aparece en una página pero, por ejemplo, en un documento, puede agregar la categoría también al documento:
---
layout: doc
title: Fruit List
categories: [fruit]
---
Y luego úsalo así:
{% for p in site.pages %}
{% if p.categories contains page.category %}
* [{{ p.title }}]({{ p.url | absolute_url }})
<small>{{ p.excerpt }}</small>
{% endif %}
{% endfor %}
Con publicaciones, esto puede ser más corto:
{% for post in site.categories[page.category] %}
* [{{ post.title }}]({{ post.url | absolute_url }})
<small>{{ post.excerpt }}</small>
{% endfor %}
Por qué esto solo funciona para las publicaciones, no pude entenderlo todavía.
El punto interesante es que este fragmento se puede usar en todas partes (¡ si mezclas documentos / páginas / publicaciones )! Así que solo _includes
como _includes
y _includes
como:
## Further Reading
{% include pages-list.md %}
Trabajo con el tema Minimal Mistakes
Hay una manera más limpia de hacer esto usando el líquido "contiene" propiedad
en _config.yml agrega tu índice de categorías
categories: [fruit, meat, vegetable, cheese, drink]
en su página. md dentro del asunto principal, agregue una o más de las categorías disponibles en _config.yml
---
layout: page
title: Orange juice
description: Orange juice is juice from oranges. It''s made by squeezing oranges.
categories: [fruit, drink]
---
en su plantilla para obtener todas las páginas en la categoría de frutas que hace:
{% for page in site.pages %}
{% if page.categories contains ''fruit'' %}
<div class="item">
<h3>{{page.title}}</h3>
<p>{{page.description}}</p>
</div>
{% endif %}
{% endfor %}
Mientras construía mi propio sitio me encontré con este mismo problema, y encontré una solución (fácil) y robusta. Espero que esto sea útil para cualquier otra persona que desee hacer algo similar.
El problema
Dado un subconjunto de páginas (no publicaciones) en el sitio, enumérelas bajo encabezados según sus categorías. Por ejemplo: dado un conjunto de páginas que consideramos páginas de recursos (o páginas de referencia, o cualquier agrupación lógica de páginas que desee mostrar), queremos enumerarlas en sus categorías (por ejemplo, código, explicación, etc.) .
La solución
Para obtener el comportamiento que queremos, tenemos que hacer modificaciones en tres lugares:
_config.yml
-
resources.md
-
resource-file- X .md
_config.yml
En _config.yml
, debemos agregar una lista de todas las categorías / palabras clave / etiquetas (o lo que quieras llamar) que aparecerán en los archivos de recursos. Esto es lo que tengo en el mío:
category-list: [code, editors, math, unix]
Puede llamar a la variable cualquier cosa, yo elijo category-list
, solo asegúrese de usar la misma variable en el archivo resource.md
.
Nota: El orden en que coloca los elementos en la lista es el orden en que se mostrarán en la página resource.md
.
resource-file- X .md
Estos son los archivos que desea indexar y vincular en la página resources.md
. Todo lo que necesita hacer es agregar dos variables de archivos al principio de cada uno de estos archivos. El primero es indicar que este archivo es un archivo de recursos .
resource: true
El segundo es indicar en qué categorías desea que se indexe este archivo. Puede indexarlo en tantas categorías como desee, y si desea que una página no esté indexada, deje la lista en blanco. Mi referencia para el manejo adecuado de EINTR en C tiene las siguientes categorías:
categories: [code, unix]
resources.md
Este es el archivo que generará la lista de páginas en función de sus respectivas categorías. Todo lo que necesita hacer es agregar el siguiente código a este archivo (o al archivo en el que desea que esté la lista):
{% 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 -->
Desglose de código
Solo una explicación rápida de cómo funciona esto:
- Pasa por cada una de las categorías especificadas en
_config.yml
. - Muestra un encabezado con ese nombre de categoría.
- Comience una lista desordenada para las páginas que pertenecen a esa categoría.
- Pasa por las páginas del sitio.
- Si la página es un archivo de recursos como lo indica el recurso variable del archivo, para cada una de las categorías a las que pertenece el archivo, si una de ellas coincide con la categoría actual que se muestra en la lista, muestre un enlace a esa página.
Nota: las variables category-list
en _config.yml
y las categories
en los archivos de recursos se pueden llamar como quieras, solo asegúrate de usar las mismas variables en el archivo que genera la lista.
Otra nota: cuando modifica _config.yml
, tiene que reiniciar completamente Jekyll, incluso si tiene la opción --watch
, debe detenerla y reiniciarla. Me tomó un tiempo descubrir por qué mis cambios no estaban teniendo efecto.
El producto final
Puede ver el producto final en la página de recursos en mi sitio , aunque hoy lo junté por lo que al momento de escribir esto, está lejos de ser completo, pero puede consultar mi biografía si lo desea en la página de inicio.
¡Espero que esto ayude!