about summary refs log tree commit diff stats
path: root/scripts/optimize_images.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/optimize_images.sh')
-rwxr-xr-xscripts/optimize_images.sh133
1 files changed, 133 insertions, 0 deletions
diff --git a/scripts/optimize_images.sh b/scripts/optimize_images.sh
new file mode 100755
index 0000000..75f04af
--- /dev/null
+++ b/scripts/optimize_images.sh
@@ -0,0 +1,133 @@
+#!/usr/bin/env nix
+#! nix shell nixpkgs#optipng nixpkgs#jpegoptim nixpkgs#nodePackages.svgo nixpkgs#dash --command dash
+
+# Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: AGPL-3.0-or-later
+#
+# This file is part of Quotify - A simple CLI utility to shell quote the text
+# inputted into it.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/agpl.txt>.
+
+# shellcheck shell=dash
+
+# source: https://github.com/stride-tasks/stride/blob/148d513297c8ae66d79fc287769adfe5e711c93c/scripts/optimize-images
+
+PROJECT_DIR="$(git rev-parse --show-toplevel)"
+
+cd "$PROJECT_DIR" || {
+    echo "No '$PROJECT_DIR' ?!"
+    exit 1
+}
+
+PNG_OPITMIZE_COMMAND='optipng --quiet -o7 -preserve'
+JPG_OPITMIZE_COMMAND='jpegoptim --quiet --strip-all -m76'
+SVG_OPITMIZE_COMMAND='svgo --multipass --quiet --input'
+
+# The extension is the part after the first dot in the filename:
+#
+# For example:
+# file.png    => png
+# file.tar.gz => tar.gz
+find_files_by_extension() {
+    wanted_extension="$1"
+    tmp="$(mktemp)"
+
+    git ls-files --cached --modified --other --exclude-standard --deduplicate | while IFS= read -r file; do
+        extension="${file#*.}"
+        if [ "$extension" = "$wanted_extension" ]; then
+            echo "$file"
+        else
+            :
+            # echo "'$file' with extension: '$extension' does not match filter: '$wanted_extension'" 1>&2
+        fi
+    done >"$tmp"
+
+    echo "$tmp"
+}
+
+size_of() {
+    du -b "$1" | cut -f1
+}
+
+bytes_human() {
+    number="$1"
+
+    numfmt --to=iec-i --suffix=B --format="%9.2f" "$number"
+}
+
+# https://stackoverflow.com/questions/44695878/how-to-calculate-percentage-in-shell-script
+# Native POSIX solution using string manipulation (assumes integer inputs).
+percent() {
+    DP="$1"
+    SDC="$2"
+
+    # Special case when DP is zero.
+    [ "$DP" = "0" ] && echo "0.00" && return
+
+    #                                  # e.g. round down   e.g. round up
+    #                                  # DP=1 SDC=3        DP=2 SDC=3
+    Percent=$((DP * 100000 / SDC + 5)) # Percent=33338     Percent=66671
+    Whole=${Percent%???}               # Whole=33          Whole=66
+    Percent=${Percent#"$Whole"}        # Percent=338       Percent=671
+    Percent=$Whole.${Percent%?}        # Percent=33.33     Percent=66.67
+    echo "$Percent"
+}
+
+TOTAL=0
+TOTAL_SAVED=0
+
+optimize_files() {
+    FILTER="$1"
+    PROGRAM="$2"
+
+    printf "%s" "Processing $FILTER files:"
+
+    FILES="$(find_files_by_extension "$FILTER")"
+    COUNT=$(wc -l <"$FILES")
+
+    if [ "$COUNT" -eq 0 ]; then
+        echo " no files found!"
+        return
+    fi
+
+    echo ""
+
+    I=1
+
+    TOTAL_INNER=0
+    TOTAL_SAVED_INNER=0
+
+    while IFS= read -r f; do
+        printf "%-2s/${COUNT} $f ... " "$I"
+
+        SIZE="$(size_of "$f")"
+
+        $PROGRAM "$f"
+
+        NEW_SIZE="$(size_of "$f")"
+        DIFF=$((SIZE - NEW_SIZE))
+
+        echo "saved: $(bytes_human "$DIFF") ($(percent $DIFF "$SIZE")%)"
+
+        TOTAL_INNER=$((TOTAL_INNER + SIZE))
+        TOTAL_SAVED_INNER=$((TOTAL_SAVED_INNER + DIFF))
+
+        I=$((I + 1))
+    done <"$FILES"
+    rm "$FILES"
+
+    echo "Total saved for $FILTER: $(bytes_human "$TOTAL_SAVED_INNER") ($(percent $TOTAL_SAVED_INNER $TOTAL_INNER)%)"
+    echo ""
+
+    TOTAL=$((TOTAL + TOTAL_INNER))
+    TOTAL_SAVED=$((TOTAL_SAVED + TOTAL_SAVED_INNER))
+}
+
+optimize_files 'png' "$PNG_OPITMIZE_COMMAND"
+optimize_files 'jpg' "$JPG_OPITMIZE_COMMAND"
+optimize_files 'jpeg' "$JPG_OPITMIZE_COMMAND"
+optimize_files 'svg' "$SVG_OPITMIZE_COMMAND"
+
+echo "Total saved: $(bytes_human "$TOTAL_SAVED") ($(percent $TOTAL_SAVED $TOTAL)%)"