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".
modified_md_files=
# 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-commit1, 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 directori pre-commit.d
, per exemple).