fix: pipeline asset riproducibile con script di ottimizzazione
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
// Pipeline asset: extract-fig-images.sh → apply-asset-map.mjs → optimize-assets.sh
|
||||
// 1. extract-fig-images.sh: estrae hash-named images da .fig → assets-src/
|
||||
// 2. apply-asset-map.mjs: copia da assets-src/ → destinazioni (src/assets/img, public/img)
|
||||
// 3. optimize-assets.sh: converte PNG fotografici → JPG q85, ridimensiona ≤1400px
|
||||
|
||||
import { copyFileSync, mkdirSync, existsSync } from 'node:fs';
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { join, dirname } from 'node:path';
|
||||
@@ -6,7 +11,10 @@ import { fileURLToPath } from 'node:url';
|
||||
const root = join(dirname(fileURLToPath(import.meta.url)), '..');
|
||||
const map = JSON.parse(readFileSync(join(root, 'scripts/asset-map.json'), 'utf8'));
|
||||
let n = 0, missing = 0;
|
||||
|
||||
// Sezione principale: copia da assets-src/
|
||||
for (const [destDir, entries] of Object.entries(map)) {
|
||||
if (destDir === 'fallbacks') continue;
|
||||
mkdirSync(join(root, destDir), { recursive: true });
|
||||
for (const [src, dest] of Object.entries(entries)) {
|
||||
const from = join(root, 'assets-src', src);
|
||||
@@ -15,5 +23,19 @@ for (const [destDir, entries] of Object.entries(map)) {
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
||||
// Sezione fallbacks: copia da path relativo alla root del repo (es. ../Dati/)
|
||||
if (map.fallbacks) {
|
||||
for (const [destDir, entries] of Object.entries(map.fallbacks)) {
|
||||
mkdirSync(join(root, destDir), { recursive: true });
|
||||
for (const [srcRelPath, dest] of Object.entries(entries)) {
|
||||
const from = join(root, srcRelPath);
|
||||
if (!existsSync(from)) { console.error(`MANCANTE (fallback): ${srcRelPath}`); missing++; continue; }
|
||||
copyFileSync(from, join(root, destDir, dest));
|
||||
n++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`Copiate ${n} immagini${missing ? `, ${missing} mancanti` : ''}`);
|
||||
process.exit(missing ? 1 : 0);
|
||||
|
||||
@@ -32,8 +32,10 @@
|
||||
"c51a49b9be7f1b1a31de6b2f5261c8c5b5fdab52.png": "about-trainer-3.png",
|
||||
"3341a11b7153349a23c75b1fa2a9a62d48953330.png": "about-trainer-4.png"
|
||||
},
|
||||
"public/img": {
|
||||
"logo-dark.png": "logo-dark.png",
|
||||
"logo-light.png": "logo-light.png"
|
||||
"fallbacks": {
|
||||
"public/img": {
|
||||
"../Dati/logo-dark.png": "logo-dark.png",
|
||||
"../Dati/logo-light.png": "logo-light.png"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Executable
+37
@@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env bash
|
||||
# Passo 3 della pipeline asset (dopo apply-asset-map.mjs).
|
||||
# Converte PNG fotografici in src/assets/img/ → JPG q85 e ridimensiona a ≤1400px larghezza.
|
||||
# I PNG partner-* (loghi con trasparenza) restano PNG.
|
||||
# Idempotente: se il .png non esiste (già convertito), salta.
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
IMG_DIR="$ROOT/src/assets/img"
|
||||
|
||||
cd "$IMG_DIR"
|
||||
|
||||
# --- PNG fotografici → JPG q85 + resize ≤1400px ---
|
||||
shopt -s nullglob
|
||||
converted=0
|
||||
for png in *.png; do
|
||||
[[ "$png" == partner-* ]] && continue
|
||||
jpg="${png%.png}.jpg"
|
||||
convert "$png" -quality 85 -resize '1400x>' "$jpg"
|
||||
rm "$png"
|
||||
echo " PNG→JPG: $png → $jpg"
|
||||
(( converted++ )) || true
|
||||
done
|
||||
|
||||
# --- Resize JPG già esistenti se >1400px ---
|
||||
resized=0
|
||||
for jpg in *.jpg; do
|
||||
w=$(identify -format '%w' "$jpg")
|
||||
if (( w > 1400 )); then
|
||||
mogrify -resize '1400x>' "$jpg"
|
||||
echo " Resize: $jpg (era ${w}px → ≤1400px)"
|
||||
(( resized++ )) || true
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Ottimizzazione completata: ${converted} PNG→JPG, ${resized} JPG ridimensionati."
|
||||
Reference in New Issue
Block a user