sutty/doc/posts.md

101 lines
3.5 KiB
Markdown
Raw Normal View History

2019-08-06 17:54:17 +00:00
# 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.
2019-08-07 15:10:14 +00:00
* Reimplementar glosario (se crea un artículo por cada categoría
utilizada)
* Reimplementar orden de artículos (ver doc)
* Convertir layout a params