Ir al contenido
Código en GitHub (se abre en una pestaña nueva)

Documentación · Referencia · El formato de un proyecto

4. Ficheros de contenido

Las páginas, sus campos reservados y los tipos de valor.

Versión 0.16

Extensiones reconocidas: .md (Markdown) y .twig (plantilla), en minúsculas: un .MD, un .TWIG o un .markdown no se compilan, se copian como cualquier otro fichero y se avisa. El punto en el nombre de una página está reservado para el idioma (contacto.eu.md, §15.2): uno que no lo es (guia.v2.md) detiene el build, y también un nombre con la extensión de un fichero que se quiere generar (robots.txt.twig, sitemap.xml.twig): para sacar un robots.txt, la página se llama robots.twig y lleva url: /robots.txt (decisión 143). Cualquier otra cosa dentro de contenido/ se copia tal cual a salida/, con su misma ruta (contenido/blog/foto.jpg → blog/foto.jpg), salvo los ficheros que empiezan por guion bajo, como _datos.yml, y el .yml que lleva el nombre de una página, que son sus campos comunes (§15.7). Lo que empieza por punto (.gitkeep, .git/), Thumbs.db y desktop.ini se ignoran. Las plantillas y los datos de otros generadores (.njk, .liquid, .vto, .webc, .11ty.js, .11tydata.js, .11tydata.json) no se copian nunca, y se avisa: publicar el código de una plantilla no es lo que se quiere, y en una migración es fácil que alguno se quede atrás. Los ficheros PHP tampoco se copian, y detienen el build (§9).

El front matter va entre ---, en YAML. Si no es YAML válido, el build se detiene con un error que indica fichero y línea: seguir sin esa página haría que el despliegue la borrara del sitio publicado.

Campos reservados:

Campo Tipo Significado
titulo texto Título de la página. Si genera HTML y falta, se avisa.
subtitulo texto Entradilla o descripción corta.
descripcion texto Descripción para buscadores (meta description).
fecha fecha Fecha de publicación (AAAA-MM-DD).
url texto URL final o patrón. Si falta, se deriva de la ruta.
plantilla texto Nombre del layout, sin extensión. false: sin layout.
etiquetas lista Colecciones a las que pertenece.
listada sí/no Si es no, se publica pero no entra en colecciones ni en el sitemap.
css lista Ficheros CSS de publico/ que necesita la página (§9).
js lista Ficheros JavaScript de publico/ que necesita (§9).
imagen texto Imagen principal, relativa a publico/.
imagenAlt texto Texto alternativo de esa imagen.
icono texto SVG, relativo a publico/.
orden número Orden manual dentro de una colección.
borrador sí/no Si es sí, no se publica.
publicar fecha No se publica antes de esa fecha.
publicarEnSuFecha sí/no Si es sí, no se publica antes de su fecha (abajo).
pdf sí/no Si es sí, la página sale además en PDF (§10.3).
componentes — Reservado para el catálogo de componentes (§13): no hace nada, y avisa si una página lo usa.
agrupar mapa La página es una plantilla que se repite por cada valor de un campo (§6.3).
paginar mapa La página parte una colección en trozos y se repite una vez por cada uno (§6.4).

idioma también está reservado, pero no se escribe: sale del nombre del fichero (contacto.eu.md, §15.2).

Cualquier otro campo se pasa a la plantilla como lo lee YAML, salvo que tenga el nombre de uno de los que el motor escribe en pagina (§7.2) y salvo los días sin hora, que llegan en la zona del sitio (fecha, abajo). El motor no valida campos desconocidos: eso es tarea del esquema (§11) y del editor. Un campo con el nombre mal escrito es, para el motor, un campo desconocido más.

Lo que sí comprueba es el valor de los campos reservados. Si no vale (una fecha imposible, un orden que no es un número), avisa con el fichero y, cuando se puede, la línea, y trata el campo como si no estuviera. Nunca detiene el build por eso. Un campo en blanco (imagen:) no es un error: pasa vacío y sin aviso, y cuenta como un valor que sustituye al heredado (§3). La excepción es titulo: una página que genera HTML sin título, o con el título vacío, avisa, porque su <title> saldría vacío. Un fragmento (url: false) o una página que genera otra cosa (/robots.txt) no lo necesitan.

Un fichero .md o .twig cuyo nombre, o el de su carpeta, empieza por guion bajo (_portada/index.md) es una página como cualquier otra, igual que en Eleventy. El guion bajo solo impide que se copien los ficheros que no son páginas.

Detalles de los tipos:

  • sí/no admite sí, si, no, true y false, sin distinguir mayúsculas ni espacios de más (Sí, NO). YAML solo reconoce los dos últimos, así que el motor traduce los otros tres; y true y false solo valen sin comillas, como los lee YAML: "true" entre comillas es un texto y se avisa.
  • fecha se escribe AAAA-MM-DD, con o sin comillas, con dos cifras para el mes y el día (sin comillas, YAML también lee 2026-1-5, pero entre comillas no). Es ese día en la zona horaria del sitio (§2), desde su medianoche: publicar: 2026-10-01 publica a las 00:00 del 1 de octubre en esa zona. Es un día y nada más: si se escribe también una hora (2026-10-01 18:30:00, 2026-10-01T18:30) o una zona, la hora no cuenta, se toma solo el día y se avisa (decisión 129). Una fecha sin comillas que no existe (2026-13-01) se lee como el texto que es: en fecha y publicar avisa, como cualquier fecha imposible, y en un campo que no es reservado llega así a la plantilla, sin aviso (decisión 88). Una fecha llega a la plantilla como una fecha, no como un texto: se escribe con el filtro fecha o con date (§7.3), y {{ pagina.fecha }} sin filtro detiene el build. En cualquier otro campo, en datos/ y en sitio.yml, un día sin hora y sin comillas (inicio: 2026-10-17) es también ese día en la zona del sitio; con hora, es el instante que lee YAML (decisión 144).
  • texto admite un número, que se toma como texto (titulo: 2024).
  • número admite un número entre comillas (orden: "2").
  • etiquetas, css y js admiten un texto suelto, que cuenta como una lista de un elemento: etiquetas: servicio es lo mismo que etiquetas: [servicio].
  • plantilla vacía (plantilla: "") es lo mismo que plantilla: false.

Publicar en su fecha. Una fecha futura no oculta nada: es una fecha más, como la de un evento en una agenda. Para un blog que se escribe por adelantado está publicarEnSuFecha: sí, que hace que la página no se publique antes de su fecha: es lo mismo que escribir publicar con esa fecha, sin repetirla. Se pone donde se pondría cualquier valor común, en el _datos.yml de la carpeta (§3), y una subcarpeta lo quita con publicarEnSuFecha: no. Una página sin fecha, o con la fecha ya pasada, no se ve afectada.

  • Quién manda. Si la página lleva publicar, manda publicar, también cuando es anterior a la fecha: una fecha escrita a propósito no se contradice con otra deducida. borrador manda sobre las dos.
  • A qué hora. Como publicar: desde la medianoche del día de la fecha en la zona horaria del sitio (§2). El sitio es estático, así que la página sale cuando el sitio se vuelve a compilar después de ese momento (§11, Programar).
  • Lo demás. Todo lo que este documento dice de una página con publicar en el futuro (§5.3, §6, §10, §15.8) vale también para una con publicarEnSuFecha y su fecha en el futuro: no genera fichero ni sale en colecciones, sitemap, feed ni traducciones. En un sitio en varios idiomas cada traducción mira su propia fecha, que normalmente es la del .yml común de la página (§15.7), así que salen el mismo día.
  • La previsualización con borradores (ehundu servir --borradores) lo trata como a publicar: lo enseña todo.

Se aceptan como alias los nombres ingleses habituales en Eleventy y Lume (title, subtitle, description, date, tags, layout, permalink), para no tener que reescribir el front matter al migrar. Si una página lleva a la vez el nombre inglés y el español, gana el español y se avisa. Los alias valen también en _datos.yml.

El alias es para el nombre del campo, no para su valor. layout: post vale, pero layout: post.njk no: plantilla es el nombre de una plantilla de Ehundu, sin extensión, y la plantilla que no existe detiene el build (§7.1). El error dice cómo quedaría el nombre sin extensión. Al migrar, los nombres de las plantillas se eligen de nuevo al pasarlas a Twig.

Ver este documento en GitHub (se abre en una pestaña nueva)