Convenzione immagini gallerie (repo l-e-a-p.github.io)
I post (_posts/) di questo repo pubblicano le gallerie usando immagini che vivono qui come file statici, sotto images/posts/. Organizzazione sempre uguale, una cartella per fotografo identificato dalla sua sigla:
images/posts/EVENTO/<sigla-fotografo>/org/ foto originali scattate (full-res) — NON pubblicate, sorgente
images/posts/EVENTO/<sigla-fotografo>/edit/ resize alleggerite, CON logo + nome del fotografo — aperte nel lightbox
images/posts/EVENTO/<sigla-fotografo>/thumb/ miniature mostrate nella griglia
org/, edit/, thumb/ contengono gli stessi nomi file. Questa struttura deve valere SEMPRE.
(NB: la vecchia cartella full/ è legacy, va rinominata in edit/.)
Sigle fotografo
La fonte di verità è tools/watermark/photographers.yml (ac, dt, gs, lz,
mdg, grdm, ff, pc, ml, sla, sl, …). Mai duplicare o invertire sigle
esistenti; le nuove ricorrenti si aggiungono lì.
Uso nei post
Si imposta gallery_path nel front-matter e si fa un include per cartella-fotografo (il match thumb/ del motore NON è ricorsivo):
---
gallery_path: /images/posts/EVENTO/ac/
---
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/glightbox/dist/css/glightbox.min.css">
<style>
.gallery { display:grid; grid-template-columns:repeat(auto-fill,minmax(180px,1fr)); gap:0.25rem; margin:1rem 0; }
.gallery a { display:block; aspect-ratio:1; overflow:hidden; }
.gallery img { width:100%; height:100%; object-fit:cover; display:block; transition:transform .3s ease; }
.gallery a:hover img { transform:scale(1.04); }
</style><div class="gallery "></div><script src="https://cdn.jsdelivr.net/npm/glightbox/dist/js/glightbox.min.js"></script>
<script>
// Una sola init per pagina (gli asset sono dietro la guardia gallery_assets_emitted):
// il selettore globale .glightbox raccoglie le griglie di TUTTE le gallerie presenti.
// I link .glightbox sono esclusi dal tagging data-lity del tema (vedi assets/js/main.js),
// quindi non c'e piu nessuna seconda lightbox (Lity) da rimuovere a valle.
(function () {
var init = function () { GLightbox({ selector: '.glightbox', loop: true, touchNavigation: true }); };
if (document.readyState !== 'loading') { init(); }
else { document.addEventListener('DOMContentLoaded', init); }
})();
</script>
Il motore del tema (so-leap-theme/_includes/gallery) è source-agnostic: prende le miniature da thumb/ e le immagini complete del lightbox da edit/, scorrendo sia le collezioni sia i file statici di questo repo (site.static_files). Le immagini delle pagine delle collezioni (_lazzaro, _archi-di-pietra) stanno invece nei rispettivi submodule.
Pipeline immagini (tools/)
Due passi separati, stack Python + Pillow (pip3 install --user Pillow pyyaml):
1. Organizzazione — tools/organize/organize.py (vedi tools/organize/README.md): da un mucchio di originali genera <evento>/<sigla>/{org,edit,thumb} (org = copia, edit = altezza 1080, thumb = lato lungo 400), rinominando in EVENTO-NN. È la versione generale e cross-platform dello storico _domeniche/bin/import-domenica.sh (bash+sips).
python3 tools/organize/organize.py <originali> _lazzaro/img/EVENTO ac
2. Watermark — tools/watermark/watermark.py (vedi tools/watermark/README.md): applica il watermark storico (monogramma LEAP bianco in basso a sinistra + nome del fotografo in Datalegreya Thin) alle immagini in edit/. Sostituisce il vecchio flusso manuale con app a pagamento.
# nome dedotto dalla sigla nel percorso (.../<sigla>/edit/)
python3 tools/watermark/watermark.py images/posts/EVENTO/ac/edit --in-place
# contributore occasionale: cartella nome-cognome, normalizzata da sola
python3 tools/watermark/watermark.py images/posts/EVENTO/marco-iacobucci/edit --in-place
# nome esplicito + cartella d'uscita separata
python3 tools/watermark/watermark.py foto_in/ -n "Alice Cortegiani" -o foto_out/
Mappa sigla→nome in tools/watermark/photographers.yml; le sigle nuove vengono chieste e salvate (in TTY). Asset: font in assets/fonts/Datalegreya-Thin.otf, logo in tools/watermark/leap-logo-w.png. Dipendenze: pip3 install --user Pillow pyyaml.
Bottega Radicale (progetti del laboratorio sul sito)
Nome pubblico: Bottega Radicale (slug/URL tecnici restano bottega).
Convenzioni complete in _bottega/CLAUDE.md (sezione «Web»). In sintesi:
un post per progetto in _bottega/web/<slug>.md (URL /bottega/web/<slug>/,
griglia per date: decrescente), immagini in
_bottega/img/<progetto>/<sessione>/<sigla>/{org,edit,thumb} processate con
tools/bottega/process-session.sh e hero/-t con tools/bottega/make-hero.py.
org/, raw/, *.mov, *.heic restano in git ma sono esclusi dal sito
(exclude a livello FILE in _config.yml, es. **/org/**).
Build e deploy del sito (GitHub Pages)
Il sito è www.leaphz.net, build legacy di GitHub Pages (Jekyll gira
sui server GitHub a ogni push sul repo principale; i push nei submodule da
soli NON muovono il sito — serve il bump del puntatore qui). Build normale
~5 min. Strumenti di controllo (serve gh autenticato):
gh api repos/l-e-a-p/l-e-a-p.github.io/pages/builds/latest # stato build
gh api -X POST repos/l-e-a-p/l-e-a-p.github.io/pages/builds # rebuild forzata
- Build incagliata (>10 min in
building): rebuild forzata, risolve. Deployment failed, try again laternelle Actions: transitorio lato GitHub, non è colpa dei contenuti — un nuovo push o la rebuild lo supera.- La CDN cachea ~10 min (
max-age=600): verificare con?v=<timestamp>. - Limite rigido GitHub: 100 MB per file (GH001, respinge il push): i file oltre soglia (video) restano in archivio locale, gitignorati con nota.
- L’
exclude:in_config.ymlper le collezioni funziona solo con pattern a livello FILE (es.**/org/**, non**/org).