Tutorial de Jekyll: Cómo crear un template

Jekyll template

En este tutorial de Jekyll en español vamos a explicar cómo modificar un template del tema minima de una instalación Jekyll por defecto. Explicaremos cómo utilizar algunos tags de Liquid y cómo usar variables en el layout.

En un primer artículo hablamos acerca de cómo crear un sitio web estático usando Jekyll. En dicho tutorial explicamos el proceso de instalación de Jekyll y la creación de un sitio bastante sencillo usando solamente archivos Markdown.

Al finalizar la instalación hemos visto que también se ha instalado por defecto un tema llamado minima.

Para efectos de este tutorial y utilizando el sitio web creado en el artículo anterior, vamos a modificar el template o layout encargado de mostrar los artículos del sitio web. Además de la fecha y el nombre del autor que aparecen por defecto en cada artículo, vamos a mostrar las categorías de cada uno.

¿Qué es un template?

Un template es un archivo que contiene etiquetas HTML y etiquetas especiales definidas por un motor de plantillas, Liquid en este caso, necesarias para conformar una página web.

Las etiquetas del motor de plantillas permiten realizar ciertas operaciones como obtener datos de fuentes externas para inyectarlos dentro del código HTML y controlar la manera en que diversos elementos de la página van a ser mostrados utilizando condicionales if y bucles for, por citar algunas.

Modificando el template de los artículos

Para modificar el template definido en un tema, primero debemos encontrar su ubicación en la estructura de archivos del tema. Para nuestro caso, el template que queremos modificar, denominado post.html, se encuentra en:

minima/
  _layouts/
    post.html

Entonces lo primero que debemos hacer es crear el directorio _layouts/ en la raíz de nuestro sitio web y dentro de él vamos a crear un archivo HTML llamado post.html:

jekyll-site/
  _layouts/
    post.html

Al hacer esto, Jekyll usará el template que estamos creando en lugar del original que viene con el tema a la hora de generar el sitio web.

En el archivo vamos a incluir el contenido original del layout, agregando un par de líneas para mostrar las categorías:

---
layout: default
---
<article class="post" itemscope itemtype="http://schema.org/BlogPosting">

  <header class="post-header">
    <h1 class="post-title" itemprop="name headline">{{ page.title | escape }}</h1>
    <p class="post-meta">
      <time datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
        {% assign date_format = site.minima.date_format | default: "%b %-d, %Y" %}
        {{ page.date | date: date_format }}
      </time>
      {% if page.author %}
        • <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span itemprop="name">{{ page.author }}</span></span>
      {% endif %}
      <!-- Categorías -->
      {% if page.category %}
        • <span itemprop="articleSection">{{ page.category }}</span>
      {% endif %}
      {% if page.categories %}
        • {% for category in page.categories %}<span itemprop="articleSection">{{ category }}</span>{% unless forloop.last %}, {% endunless %}{% endfor %}
      {% endif %}
      <!-- End categorías -->
    </p>
  </header>

  <div class="post-content" itemprop="articleBody">
    {{ content }}
  </div>

  {% if site.disqus.shortname %}
    {% include disqus_comments.html %}
  {% endif %}
</article>

Al verificar el sitio web en nuestro navegador veremos que junto a la fecha aparecerá la categoría o categorías a las que pertenece el artículo.

Sitio web Jekyll

En las siguientes secciones vamos a explicar con más detalle las variables y tags usados en este template.

Front Matter en el template

Al inicio del template encontramos la siguiente sección:

---
layout: default
---

Al igual que en los archivos Markdown, también es posible definir un Front Matter en el template. El fragmento nos indica que el contenido de este template va a ser insertado en donde quiera que aparezca la variable {{ content }} dentro del template default.html.

El template default.html define la estructura básica de un documento HTML, así como las etiquetas <meta> requeridas, el footer y la navegación del sitio web.

Variables

Liquid, el motor de plantillas que utiliza Jekyll, permite incluir en el template la información almacenada en el archivo _config.yml, en los archivos YAML ubicados en el directorio _data/ y en el Front Matter de templates y archivos Markdown, utilizando variables.

Incluyendo información del archivo _config.yml

Por ejemplo, si definimos la variable text en el archivo _config.yml:

text: Blah

Podemos insertar el contenido en el template de la siguiente forma:

{{ site.text }}

Como resultado, el contenido de la variable text, es decir Blah, se insertará en el lugar en donde coloquemos la variable {{ site.text }} dentro del código HTML.

Incluyendo información de los archivos en el directorio _data/

Ahora, si tenemos un archivo en el directorio _data/ llamado people.yml con la siguiente información:

James T Kirk:
  bio: Blah blah blah

Podemos incluir el contenido de la variable bio en el template de la siguiente forma:

{{ site.people["James T Kirk"].bio }}

Incluyendo información del Front Matter

Así mismo, la información que definamos en el Front Matter de los templates o de los archivos Markdown:

---
text: Blah
---

Se puede utilizar en el template de la siguiente forma:

{{ page.text }}

La variable {{ page }} contiene información adicional sobre la página como la URL, el autor o autores, las categorías y las etiquetas. Por ejemplo, para insertar la URL del artículo en una etiqueta <a> podemos hacer lo siguiente:

<a href="{{ page.url }}">Click here!</a>

También existen variables especiales como la variable {{ content }}, que podemos ver en el template que acabamos de modificar, y que permite insertar el contenido de cualquier archivo que defina este template como layout en el Front Matter.

El listado completo de las variables disponibles se puede encontrar en la documentación de Jekyll.

Tags y filters

Por otro lado tenemos los tags de Liquid. Estos tags permiten realizar operaciones como asignar variables, incluir fragmentos HTML de archivos externos en un template, controlar las secciones que deben ser visibles usando condicionales if y bucles for, por citar algunas.

{% assign %}

El tag {% assign %} se utiliza para crear nuevas variables a partir de otras ya existentes. A continuación podemos ver la forma correcta de incluir el tag:

{% assign date_format = site.minima.date_format | default: "%b %-d, %Y" %}

En este ejemplo, tomado del template que acabamos de modificar, se crea la variable date_format cuyo contenido va a ser el mismo de la variable site.minima.date_format.

Además notamos el uso de un filter para realizar un procesamiento adicional del contenido. El filter default se utiliza para asignar valores por defecto en caso de que una variable no exista.

En este caso, si la variable site.minima.date_format no existe, el filter va a asignar el valor %b %-d, %Y a la variable date_format.

En la documentación de Jekyll y Liquid se pueden consultar todos los filters disponibles.

{% include %}

El tag {% include %} permite incluir el contenido de un archivo externo, comúnmente llamado include, dentro de un template:

{% include disqus_comments.html %}

En este fragmento, el tag le indica a Jekyll el lugar exacto en el que debe incluir el contenido del archivo _includes/disqus_comments.html en el template.

El archivo externo o include debe crearse dentro del directorio _includes/ del sitio web para que el tag pueda localizarlo correctamente.

{% if %}

El tag {% if %} es utilizado con frecuencia para mostrar secciones de un template dependiendo de ciertas condiciones:

{% if page.category %}
  • <span itemprop="articleSection">{{ page.category }}</span>
{% endif %}

En el ejemplo, el nombre de la categoría a la que pertenece el artículo se va a mostrar únicamente cuando la variable page.category exista. Es decir, cuando hayamos definido la variable category en el Front Matter del artículo.

{% for %} y {% unless %}

El tag {% for %} se utiliza para recorrer listas o diccionarios de datos:

{% if page.categories %}{% for category in page.categories %}<span itemprop="articleSection">{{ category }}</span>{% unless forloop.last %}, {% endunless %}{% endfor %}
{% endif %}

En el fragmento, el tag se utiliza para recorrer la variable page.categories, la cual es una lista de las categorías en el artículo, y de esta forma agregar cada una de las categorías al template.

En el ejemplo también podemos apreciar el uso del tag {% unless %}, el cual es el equivalente de {% if foo != bar %}.

La variable forloop.last es una de las variables que están disponibles dentro de un bucle for y permite saber si la presente iteración es la última del bucle. En la documentación de Liquid se pueden consultar las demás variables del objeto forloop.

Así mismo, la documentación de Jekyll y la de Liquid contienen la descripción de todos los tags que pueden ser usados a la hora de crear templates.