97 lines
3.3 KiB
Markdown
97 lines
3.3 KiB
Markdown
|
# Posts
|
||
|
|
||
|
Los posts no corresponden con un modelo en la base de datos, porque se
|
||
|
nos va a complicar sincronizar los datos con el repositorio.
|
||
|
|
||
|
## Jekyll
|
||
|
|
||
|
Como en Jekyll, los artículos son archivos con el siguiente formato:
|
||
|
|
||
|
* Ubicación: _lang/ en lugar de guardar los archivos en _posts, usamos
|
||
|
i18n y guardamos cada uno en el directorio de su propio idioma.
|
||
|
|
||
|
* Nombre: el nombre del archivo contiene la fecha en formato aaaa-mm-dd,
|
||
|
seguidos de un guión, el título en minúsculas y con los espacios
|
||
|
convertidos en guiones. La extensión es .markdown.
|
||
|
|
||
|
Esto también funciona como identificador único.
|
||
|
|
||
|
* Metadatos: Los metadatos del artículo se vuelcan en formato YAML al
|
||
|
principio del archivo, el bloque comienza y termina con tres guiones
|
||
|
("---") en líneas separadas
|
||
|
|
||
|
* Contenido: El contenido del artículo va a continuación de los
|
||
|
metadatos, en formato Markdown
|
||
|
|
||
|
## I18n
|
||
|
|
||
|
Todos los artículos están listos para ser traducidos. Esto ya no es
|
||
|
opcional como antes porque nos genera muchos casos especiales.
|
||
|
|
||
|
La i18n incluye una lista de los nombres de archivo que identifican a
|
||
|
los posts en otros idiomas, para intervincularlos.
|
||
|
|
||
|
## Plantillas de metadatos
|
||
|
|
||
|
Todos los campos de la sección de metadatos son plantillas, incluso para
|
||
|
los artículos, hay una plantilla por defecto con los campos más comunes.
|
||
|
|
||
|
Esto nos permite adaptar distintos tipos de artículos y unificar todo el
|
||
|
desarrollo en una sola lógica.
|
||
|
|
||
|
El sitio contiene una descripción de todas las plantillas. Cuando se
|
||
|
crea un artículo del tipo correspondiente con la plantilla, el artículo
|
||
|
hereda todas las plantillas como atributos y valida la presencia de los
|
||
|
obligatorios y los tipos de datos incorporados.
|
||
|
|
||
|
## Archivos
|
||
|
|
||
|
El nombre de la plantilla de metadatos corresponde con una plantilla
|
||
|
HTML:
|
||
|
|
||
|
```bash
|
||
|
_data/templates/post.yml
|
||
|
_layouts/post.html
|
||
|
```
|
||
|
|
||
|
Al crear el artículo, el metadato `layout:` se completa con el nombre de
|
||
|
la plantilla. Todavía no tenemos un método para cambiar un artículo de
|
||
|
plantilla, ya que requiriría recargar todos los campos.
|
||
|
|
||
|
## Implementación
|
||
|
|
||
|
La clase `MetadataTemplate` representa los valores posibles de un
|
||
|
metadato abstracto. Cada tipo de valor específico tiene su
|
||
|
`MetadataType` donde `Type` es el tipo de metadato. Esto
|
||
|
permite que cada tipo sepa como cargar sus valores por defecto y demás.
|
||
|
|
||
|
La clase `Template` contiene un hash de `{ campo: MetadataTemplate }`.
|
||
|
Su nombre es el nombre de la plantilla.
|
||
|
|
||
|
`Site#templates` contiene un hash de `{ nombre: Template }` para
|
||
|
búsqueda rápida.
|
||
|
|
||
|
`Post#template` es el `Site#templates[:template]` correspondiente.
|
||
|
|
||
|
`Post` es un tipo de `OpenStruct` que valida los valores contra las
|
||
|
plantillas de `Post#template`. Además, puede obtener valores por
|
||
|
defecto. Para esto, se lo construye con el sitio y plantilla. A partir
|
||
|
de esto se generan los `MetadataType` correspondientes, que son
|
||
|
los capaces de generar sus propios valores por defecto.
|
||
|
|
||
|
De dónde obtienen los valores actuales los `MetadataType`?
|
||
|
|
||
|
Cada atributo es una instancia de `PostMetadataType`.
|
||
|
|
||
|
`Post#title` trae el título desde los metadatos leídos o el título por
|
||
|
defecto. `Post#title.values` trae los valores posibles.
|
||
|
|
||
|
Los `Post` se generan desde `Site#posts` que es una relación, al estilo
|
||
|
ActiveRecord.
|
||
|
|
||
|
Al instanciar un `Post`, se pasan el sitio y la plantilla por defecto.
|
||
|
|
||
|
## TODO
|
||
|
|
||
|
* Leer artículos a medida que se los necesita en lugar de todos juntos.
|