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,trueyfalse, 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; ytrueyfalsesolo 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 lee2026-1-5, pero entre comillas no). Es ese día en la zona horaria del sitio (§2), desde su medianoche:publicar: 2026-10-01publica 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: enfechaypublicaravisa, 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 filtrofechao condate(§7.3), y{{ pagina.fecha }}sin filtro detiene el build. En cualquier otro campo, endatos/y ensitio.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,cssyjsadmiten un texto suelto, que cuenta como una lista de un elemento:etiquetas: servicioes lo mismo queetiquetas: [servicio].plantillavacía (plantilla: "") es lo mismo queplantilla: 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, mandapublicar, también cuando es anterior a lafecha: una fecha escrita a propósito no se contradice con otra deducida.borradormanda sobre las dos. - A qué hora. Como
publicar: desde la medianoche del día de lafechaen 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
publicaren el futuro (§5.3, §6, §10, §15.8) vale también para una conpublicarEnSuFechay sufechaen el futuro: no genera fichero ni sale en colecciones, sitemap, feed ni traducciones. En un sitio en varios idiomas cada traducción mira su propiafecha, que normalmente es la del.ymlcomú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 apublicar: 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.