#!/usr/bin/env bash set -euo pipefail script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" svg_dir="$script_dir/svg" out_dir="$script_dir/img" logo_svg="$script_dir/logo.svg" sizes=(16 32 64) logo_sizes=(16 32 48 64 96 128) themes=(light dark) inkscape_cmd=() temp_dir="" cleanup() { if [[ -n "$temp_dir" && -d "$temp_dir" ]]; then rm -rf "$temp_dir" fi } trap cleanup EXIT get_theme_color() { case "$1" in light) printf '%s\n' '#000000' ;; dark) printf '%s\n' '#ffffff' ;; *) printf 'Unknown theme: %s\n' "$1" >&2 exit 1 ;; esac } ensure_temp_svg() { local input_svg="$1" local color="$2" local temp_svg="$3" python3 - "$input_svg" "$color" "$temp_svg" <<'PY' import pathlib import re import sys input_path = pathlib.Path(sys.argv[1]) color = sys.argv[2] output_path = pathlib.Path(sys.argv[3]) content = input_path.read_text(encoding="utf-8") patched, count = re.subn(r"]*?)>", f'', content, count=1) if count != 1: raise SystemExit("Couldn't find tag to patch.") output_path.write_text(patched, encoding="utf-8") PY } export_png() { local input_svg="$1" local out_file="$2" local size="$3" echo "Exporting $out_file..." "${inkscape_cmd[@]}" "$input_svg" \ --export-type=png \ --export-filename="$out_file" \ --export-width="$size" \ --export-height="$size" \ --actions=export-do } resolve_inkscape_cmd() { if command -v inkscape >/dev/null 2>&1; then inkscape_cmd=(inkscape) return 0 fi if command -v flatpak >/dev/null 2>&1; then if flatpak info org.inkscape.Inkscape >/dev/null 2>&1; then inkscape_cmd=( flatpak run --filesystem="$script_dir" --filesystem=/tmp --command=inkscape org.inkscape.Inkscape ) return 0 fi fi echo "Inkscape CLI is not installed or not in PATH, and Flatpak Inkscape (org.inkscape.Inkscape) was not found." >&2 exit 1 } mkdir -p "$out_dir" "$svg_dir" if ! command -v python3 >/dev/null 2>&1; then echo "python3 is required to patch the SVG color attribute." >&2 exit 1 fi resolve_inkscape_cmd temp_dir="$(mktemp -d "/tmp/psitransfer-filelink-svg2img.XXXXXX")" if [[ -f "$logo_svg" ]]; then for size in "${logo_sizes[@]}"; do export_png "$logo_svg" "$out_dir/logo${size}.png" "$size" done # Keep a generic logo export for docs/UI usage. export_png "$logo_svg" "$out_dir/logo.png" 512 else echo "Logo source not found: $logo_svg" >&2 fi shopt -s nullglob svg_files=("$svg_dir"/*.svg) shopt -u nullglob if [[ ${#svg_files[@]} -eq 0 ]]; then echo "No themed SVG icons found in $svg_dir. Logo exports completed." exit 0 fi temp_svg="$temp_dir/themed-icon.svg" for svg_path in "${svg_files[@]}"; do base_name="$(basename "${svg_path%.svg}")" for theme in "${themes[@]}"; do color="$(get_theme_color "$theme")" ensure_temp_svg "$svg_path" "$color" "$temp_svg" for size in "${sizes[@]}"; do out_file="$out_dir/$base_name-$theme-$size.png" echo "Exporting $out_file (color $color)..." "${inkscape_cmd[@]}" "$temp_svg" \ --export-type=png \ --export-filename="$out_file" \ --export-width="$size" \ --export-height="$size" \ --actions=export-do done done done echo "Done generating logo PNGs and light/dark themed icon PNGs."