2.5 Plantillas

Un tema de Hugo consta de dos componentes principales: plantillas y archivos web. El primero es esencial y le dice a Hugo cómo presentar una página.24 El último es opcional pero también importante. Por lo general, consta de archivos CSS y JavaScript, así como otros recursos, como imágenes y videos. Estos activos determinan la apariencia y la funcionalidad de su sitio web, y algunos pueden estar integrados en el contenido de sus páginas web.

Puede obtener más información sobre las plantillas de Hugo en la documentación oficial (https://gohugo.io/templates/overview/). Hay muchos tipos diferentes de plantillas. Para que le resulte más fácil dominar las ideas clave, creé un tema de Hugo muy mínimo, que cubre la mayoría de las funcionalidades que un usuario promedio puede necesitar, pero el número total de líneas es de solo 150, por lo que podemos hablar de todas las fuentes código de este tema en la siguiente subsección.

2.5.1 Un pequeño ejemplo

XMin es un tema de Hugo. Lo escribí desde cero en aproximadamente 12 horas. Aproximadamente media hora se gastó en plantillas, se dedicaron 3,5 horas a modificar los estilos CSS y se gastaron 8 horas en la documentación (https://xmin.yihui.name). Creo que este puede ser un caso representativo de cuánto tiempo pasaría en cada parte cuando diseñe un tema. Está, quizás, en nuestra naturaleza pasar mucho más tiempo en cosas cosméticas como CSS que en cosas esenciales como plantillas. Mientras que la codificación es, a menudo, más fácil que la documentación.

Mostraremos el código fuente del tema XMin. Debido a que el tema puede actualizarse ocasionalmente en el futuro, puede seguir este enlace para obtener una versión fija de la que hablaremos en esta sección: https://github.com/yihui/hugo-xmin/tree/4bb305. A continuación se muestra una vista en árbol de todos los archivos y directorios del tema:

LICENSE.md y README.md no son componentes necesarios de un tema, pero definitivamente debe elegir una licencia para su código fuente para que otras personas puedan usar su código correctamente, y un README puede ser la breve documentación de su software.

El archivo archetypes/default.md define la plantilla predeterminada en función de qué usuarios pueden crear nuevas publicaciones. En este tema, default.md solo proporcionaba metadatos YAML vacíos:

Los directorios más importantes de un tema son layouts/ y static/. Las plantillas HTML se almacenan en layouts/, y los archivos se almacenan en static/.

Para comprender layouts/, debe conocer algunos conceptos básicos sobre HTML (consulte la sección B.1) porque las plantillas en este directorio son, en su mayoría, documentos o fragmentos HTML. Hay muchos tipos posibles de subdirectorios en layouts/, pero solo vamos a introducir dos aquí: _default/ y partials/.

  • El directorio _default/ es donde almacena las plantillas predeterminadas para sus páginas web. En el tema XMin, tenemos tres plantillas: single.html,list.html, y terms.html.

    • single.html es una plantilla para presentar páginas individuales. Una sola página básicamente corresponde a un documento de Markdown bajo content/, y contiene tanto los metadatos (YAML) como el contenido. Por lo general, queremos mostrar el título de la página, el autor, la fecha y el contenido. A continuación se muestra el código fuente de single.html de XMin:

      Verá muchos pares de corchetes {{}}, y así es como se programan las plantillas usando las variables y funciones de Hugo.

      La plantilla comienza con una plantilla parcial header.html, para la cual verá el código fuente pronto. Por ahora, puede imaginarlo como todas las etiquetas HTML antes del cuerpo de su página (e.g., <html><head>). Ls plantillas parciales se usan, principalmente, para reutilizar código HTML. Por ejemplo, todas las páginas HTML pueden compartir tags muy similares <head></head>, y puede factorizar las partes comunes en plantillas parciales.

      Los metadatos de una página se incluyen en un elemento <div> con la clase article-meta. Recomendamos que asigne clases a elementos HTML al diseñar plantillas, de modo que sea más fácil aplicar estilos CSS a estos elementos usando nombres de clase. En una plantilla, tiene acceso a muchas variables proporcionadas por Hugo, por ejemplo, la variable .Title almacena el valor del título de la página, y escribimos el título en <span> en un encabezado de primer nivel <h1>. De forma similar, el autor y la fecha se escriben en <h2>, pero solo si se proporcionan en los metadatos YAML. La sintaxis {{ con FOO }}{{ . }}{{ end }} es una abreviatura de {{si FOO }}{{ FOO }}{{ end }}, es decir, le ahorra el esfuerzo de digitar la expresión FOO dos veces usando {{ . }}. El método .Format se puede aplicar a un objeto de fecha, y en este tema, formateamos las fechas en el formato YYYY/mm/dd (2006/01/02 es la forma de especificar el formato en Go) .

      Luego mostramos el contenido de una página, que se almacena en la variable .Content. El contenido está envuelto en una etiqueta HTML semántica <main>.

      La plantilla finaliza después de incluir otra plantilla parcial footer.html (código fuente que se mostrará en breve).

      Para que sea más fácil de entender cómo funciona una plantilla, mostramos un mínimo ejemplo de publicación a continuación:

      Con la plantilla single.html, se convertirá en una página HTML con un código fuente que se parece más o menos a esto (con el encabezado y el pie de página omitidos):

      Para un ejemplo completo de una página sencilla, puede ver https://xmin.yihui.name/about/.

    • list.html es la plantilla para generar listas de páginas, como una lista de publicaciones de blog, o una lista de páginas dentro de una categoría o etiqueta. Aquí está su código fuente:

      Nuevamente, usa dos plantillas parciales header.html y footer.html. La expresión {{if not .IsHome}} significa, si esta lista no es la página de inicio, muestre el título de la página. Esto es porque no quiero mostrar el título en la página de inicio. Es solo mi preferencia personal. Sin duda, puede mostrar el título en <h1> en la página de inicio, si lo desea.

      El {{.Content}} muestra el contenido de la lista. Tenga en cuenta que típicamente .Content está vacío, lo que puede sorprender. Esto se debe a que una página de lista no se genera a partir de un archivo de marca de origen de forma predeterminada. Como sea, hay una excepción. Cuando se escribe un archivo Markdown especial _index.md en un directorio correspondiente al nombre de la lista, el .Contenido de la lista será el contenido de este archivo Markdown. Por ejemplo, puede definir el contenido de su página de inicio en content/_index.md, y el contenido de la página de la lista de publicaciones en content/post/_index.md.

      A continuación, generamos la lista utilizando un bucle (range) a través de todas las páginas filtradas por la condición de que la sección de una página no debe estar vacía. “Section” en Hugo significa el nombre del subdirectorio de primer nivel bajo content/. Por ejemplo, la sección de content/post/foo.md es post. Por lo tanto, el filtro significa que enumeraremos todas las páginas bajo subdirectorios de content/. Esto excluirá las páginas debajo del directorio raíz content/, como content/about.md.

      Tenga en cuenta que la variable .Data es dinámica y su valor cambia de acuerdo con la lista específica que desea generar. Por ejemplo, la página de la lista https://xmin.yihui.name/post/ solo contiene páginas bajo content/post/, y https://xmin.yihui.name/note/ solo contiene páginas bajo content/note/. Estas páginas de lista son generadas automáticamente por Hugo, y no necesita pasar explícitamente por las secciones publicación y nota. Es decir, una sola plantilla list.html generará múltiples listas de páginas según las secciones y los términos de taxonomía (por ejemplo, categories y tags) que tenga en su sitio web.

      Los elementos de la lista están representados por las etiquetas HTML <li> en <ul>. Cada elemento consta de la fecha, el enlace y el título de una página. Puede ver https://xmin.yihui.name/post/ para obtener un ejemplo completo de una página de lista.

    • terms.html es la plantilla para la página de inicio de los términos de la taxonomía. Por ejemplo, puede usarlo para generar la lista completa de categorías o etiquetas. El código fuente está a continuación:

      Similar a list.html, también usa un bucle. La variable .Data.Terms almacena todos los términos bajo una taxonomía, por ejemplo, todos los nombres de categorías. Puede considerarlo como una lista con nombre en R (llamado ‘map’ en Go), cuyos nombres son los términos y los valores son listas de páginas. La variable $key denota el término y $value denota la lista de páginas asociadas con este término. Lo que presentamos en cada <li> es un enlace al término página, así como el recuento de publicaciones que utilizan este término (len es una función Go que devuelve la longitud de un objeto).

      Hugo representa automáticamente todas las páginas de taxonomía, y los nombres de ruta son las formas plurales de las taxonomías, por ejemplo, https://xmin.yihui.name/categories/ y https://xmin.yihui.name/tags/. Ese es el significado de .Data.Plural. El $ inicial es obligatorio porque estamos dentro de un bucle y necesitamos acceder a variables del alcance externo. El enlace del término se pasa a la función Hugo relURL a través de una conector | para hacerlo relativo, lo cual es una buena práctica porque los enlaces relativos son más portátiles (independientemente del nombre de dominio).

  • El directorio parials/ es el lugar para poner los fragmentos HTML para ser reutilizados por otras plantillas a través de la función partial. Tenemos cuatro plantillas parciales bajo este directorio:

Hay una plantilla especial 404.html, que Hugo usa para crear la página 404 (cuando no se encuentra una página, se muestra esta página):

Con todas las plantillas anteriores, podremos generar un sitio web a partir de los archivos fuente de Markdown. Sin embargo, es poco probable que esté satisfecho con el sitio web porque los elementos HTML no tienen ningún estilo y la apariencia predeterminada puede no parecer atractiva para la mayoría de las personas. Puede haber notado que en header.html, hemos incluido dos archivos CSS, /css/style.css y /css/fonts.css.

Puede encontrar muchos frameworks CSS de código abierto existentes que se pueden aplicar a un tema de Hugo. Por ejemplo, el framework CSS más popular puede ser Bootstrap: http://getbootstrap.com. Cuando estaba diseñando XMin, me preguntaba hasta dónde podría llegar sin usar ninguno de estos frameworks existentes, porque generalmente son muy grandes. Por ejemplo, bootstrap.css tiene casi 10000 líneas de código cuando no se minimiza. Resultó que pude obtener una apariencia satisfactoria con aproximadamente 50 líneas de CSS, que explicaré en detalle a continuación:

Los dos archivos CSS se colocan bajo el directorio static/css/ del tema. En la plantilla HTML header.html, la ruta /css/style.css se refiere al archivo static/css/style.css.

Por último, este tema proporcionó un sitio de ejemplo en exampleSite/. La estructura del directorio puede ser un poco confusa porque este es un tema en lugar de un sitio web. En la práctica, todo lo que se encuentra debajo de exampleSite/ debe estar debajo del directorio raíz de un sitio web, y el directorio hugo-xmin/ de nivel superior debe estar bajo el directorio themes/ de este sitio web, i.e.,

El sitio de ejemplo proporciona una muestra config.toml, una página de inicio _index.md, una página sobre about.md, dos publicaciones bajo note/ y dos bajo post/. También anula el foot_custom.html en el tema.

2.5.2 Implementando más funciones

El XMin es en realidad un tema altamente funcional, pero entendemos que puede ser demasiado mínimo para usted. Hay algunas características comúnmente utilizadas (intencionalmente) que faltan en este tema, y le enseñaremos cómo agregarlas usted mismo si así lo desea. Todas estas características y el código fuente se pueden aplicar también a otros temas.

Editar un archivo de texto en línea en GitHub.

FIGURA 2.3: Editar un archivo de texto en línea en GitHub.

Después de digerir el tema XMin y las implementaciones de funciones adicionales, debería ser mucho más fácil entender las plantillas de otras personas. Hay una gran cantidad de temas de Hugo, pero las principales diferencias entre ellos suelen ser estilos. Los componentes básicos de las plantillas son a menudo similares.


  1. La funcionalidad más común de las plantillas es hacer páginas HTML, pero también puede haber plantillas especiales, por ejemplo, para fuentes RSS y sitemaps, que son archivos XML.

  2. En mi opinión, en realidad debería llamarse “solicitud de fusión”