Zola Git Hook: actualitzant les dates de les publicacions
Per tal de mantenir l’atribut «Última actualització» de les publicacions sempre precís, he automatitzat la seva modificació amb un hook pre-commit de Git.
Un hook (ganxo) pre-commit de Git és un script que s’executa automàticament abans de cada commit. Pot realitzar accions personalitzades com validar el codi, executar proves o, en aquest cas, actualitzar les dates de les publicacions.
El hook
Aquest script de Bash crea o modifica el camp updated
en la front matter dels fitxers Markdown del commit amb la seva última data de modificació.
Aquí està el codi (també disponible a gist):
#!/usr/bin/env bash
# Requereix Bash 4.0 o superior.
# Aquest script actualitza el camp 'updated' en la metainformació dels fitxers .md modificats,
# establint la seva última data de modificació.
# Funció per sortir de l'script amb un missatge d'error.
# Funció per extreure la data de la metainformació.
# Obté els fitxers .md modificats, ignorant els fitxers "_index.md".
# Recorre cada fitxer .md modificat.
for; do
# Última data de modificació.
last_modified_date=
# Extreu el camp "date" de la metainformació.
date_value=
# Salta el fitxer si la última data de modificació és igual al camp "date".
if ; then
continue
fi
# Actualitza el camp "updated" amb la última data de modificació.
# Si el camp "updated" no existeix, el crea sota el camp "date".
&& ||
# Afegeix els canvis a staging.
done
Configuració
Després de configurar el teu projecte de Zola i el repositori Git:
-
Crea o actualitza el fitxer
pre-commit
dins de.git/hooks
(al directori arrel del projecte) amb l’script anterior. -
Fes que l’script sigui executable amb
chmod +x .git/hooks/pre-commit
.
Així de simple.
A partir d’ara, cada vegada que facis un commit dels fitxers Markdown amb un camp date
, el camp updated
serà creat o actualitzat amb la data de l’última modificació del fitxer en format ISO 8601 (p. ex., 2027-08-29).
Extra: Compressió sense pèrdua de PNGs
Per millorar l’eficiència, m’encanta comprimir (sense pèrdua) els fitxers. Amb aquest objectiu he actualitzat l’script per incloure la compressió de PNG amb oxipng o optipng.
Ja que no es pot tenir més d’un hook pre-commit[1], he incorporat la funcionalitat de compressió a l’script anterior afegint aquestes línies (gist amb l’script complet):
# Comprovar si oxipng o optipng estan disponibles.
if ; then
png_compressor="oxipng -o max"
elif ; then
png_compressor="optipng -o 7"
fi
# Si s'ha instal·lat algun dels compressors…
if ; then
# Obté els fitxers PNG modificats o afegits.
# Itera per cada fitxer PNG.
for; do
# Comprimeix el fitxer PNG.
||
# Afegeix canvis a staging.
done
fi
Amb aquestes línies addicionals, si s’ha instal·lat un compressor PNG, l’script recorrerà els fitxers PNG que del commit i els comprimirà sense pèrdua.
Ara pots mantenir fàcilment les dates de «Última actualització» precises per a les entrades de Zola i optimitzar les imatges PNG per a uns temps de càrrega més ràpids.
Amb el temps, he afegit altres funcionalitats com evitar commits d’esborranys o d’arxius que inclouen «TODO», i executar scripts d’optimització. Pots fer una ullada al hook que estic utilitzant actualment aquí.
-
Si prefereixes mantenir funcionalitats separades i utilitzar diversos fitxers per als scripts pre-commit, pots crear un fitxer
pre-commit
que invoqui tots els altres scripts (que pots dins d’un directoripre-commit.d
, per exemple). ↩