#!/bin/sh -eu WIDTH=800 usage() { echo "usage: ${0##*/} []" >&2 && exit 1; } check_first_arg() { if test -z "$1"; then usage; fi; } dry_run_if_no_dst() { if test -z "$2"; then dry_run "$1" && return 1; fi; } dry_run() { sed 's,\.[^./]*_$,\.png,;s,^'"$1"/',,' && echo "$HTML"; } trim_() { sed 's,^'"$1"/',,'; } stat_() { s_src=$(stat -f'%z' "$SRC/$2") s_dst=$(stat -f'%z' "$DST/$3") echo 'sh stat '"${1#"$SRC/"}"' > '"$3"' '"$s_src"' -> '"$s_dst"; } find_() { find "$1" -type f \ \( -name '*.jpg_' -o -name '*.png_' -o -name '*.gif_' \); } html_head() { echo '

'; } html_img() { echo '
'; } html_p() { echo '

'"$1"; } magick_cmd() { if command -v magick \ >/dev/null 2>&1; then echo 'magick'; else echo 'convert'; fi; } magick_() { "$(magick_cmd)" "$SRC/$1" \ -resize "${WIDTH}x"\> \ -ordered-dither 4x4 \ -colors 8 PNG8:"$DST/$2"; } write_png() { out="${1%.*_}.png" mkdir -p "$(dirname "$DST/$out")" magick_ "$1" "$out" pngquant --strip --force --ext .png "$DST/$out" echo "$out" stat_ "$0" "$1" "$out" >&2 } generate() { while read -r f; do write_png "$f"; done; } size() { while read -r f; do stat -f'%z' "$DST/$f"; done; } sum() { (echo 0 && sed 's/^/ + /') | tr -d '\n' | bc; } html_imgs() { echo "$1" | while read -r f; do html_img "$f"; done; } write_html() { (html_head && html_imgs "$1" && html_p "$2") >"$DST/$HTML" && echo "$HTML"; } main() { check_first_arg "$@" SRC="$1" HTML='.ssg.imgs.html' imgs=$(find_ "$SRC") echo "$imgs" | dry_run_if_no_dst "$@" || exit 1 DST="$2" files=$(echo "$imgs" | trim_ "$SRC" | generate) echo "$files" total_size=$(echo "$files" | size | sum) write_html "$files" "$total_size" } main "$@"