Files
roll20-character-sheets/process-fonts.sh
T

159 lines
4.5 KiB
Bash
Executable File

#!/bin/zsh
setopt ERR_EXIT
setopt PIPE_FAIL
setopt NO_UNSET
if [[ -z "${DISCORD_ACTIVITY_CLIENT_ID}" ]]; then
print "Error: DISCORD_ACTIVITY_CLIENT_ID environment variable is required" >&2
exit 1
fi
# Process arguments
test_mode=0
no_prompt=0
output_dir="/tmp/discord-fonts"
while [[ $# -gt 0 ]]; do
case $1 in
--test)
test_mode=1
shift
;;
--no-prompt)
no_prompt=1
shift
;;
--output-dir)
output_dir="$2"
shift 2
;;
*)
shift
;;
esac
done
# Clean/create output directory
if [[ -d "$output_dir" ]]; then
rm -rf "$output_dir"
fi
mkdir -p "$output_dir"
print "Starting directory search..." >&2
# Get directories
dirs=(*(/))
dirs=(${dirs:#contrib}) # Exclude contrib
dirs=(${dirs:#.git}) # Exclude .git
dirs=(${dirs:#node_modules}) # Exclude node_modules
if [[ ${#dirs} -eq 0 ]]; then
print "No directories found!" >&2
exit 1
fi
if [[ $test_mode -eq 1 ]]; then
print "Test mode: processing first 5 directories" >&2
dirs=(${dirs[1,5]})
fi
print "\nFound directories:" >&2
print -l " ${dirs[@]}" >&2
# Extract URLs function
extract_font_urls() {
perl -ne '
next if /^\s*\/\*/; # Skip comment lines
while (/url\(['"'"'"]?(https:\/\/fonts\.googleapis\.com[^'"'"'"\s\)]+)['"'"'"]?\)/g) {
print "$1\n";
}
' "$1"
}
# Process each directory
for dir in ${dirs[@]}; do
print "Checking directory: $dir" >&2
mkdir -p "$output_dir/$dir"
# Find CSS files directly in this directory
css_files=($dir/*.css(.N))
if [[ ${#css_files} -gt 0 ]]; then
print "Found CSS files in $dir:" >&2
print -l " ${css_files[@]}" >&2
# Collect URLs for this directory
urls_file=$(mktemp)
trap "rm -f '$urls_file'" EXIT
for css_file in ${css_files[@]}; do
print "Processing: $css_file" >&2
found_urls=$(extract_font_urls "$css_file")
if [[ -n "$found_urls" ]]; then
print "Found font URLs in $css_file:" >&2
print -l " $found_urls" >&2
print "$found_urls" >> "$urls_file"
fi
done
# If we found URLs in this directory
unique_urls=($(sort -u "$urls_file"))
if [[ ${#unique_urls} -gt 0 ]]; then
print "\nFound ${#unique_urls} unique font URLs in $dir" >&2
if [[ $no_prompt -eq 0 ]]; then
print "Proceed with fetching and transforming URLs for $dir? [y/N] " >&2
read -q response || true
print >&2
if [[ "$response" != "y" ]]; then
print "Skipping $dir" >&2
touch "$output_dir/$dir/fonts.css"
continue
fi
fi
raw_file=$(mktemp)
trap "rm -f '$raw_file'" EXIT
# Process URLs for this directory
for font_url in $unique_urls; do
response=$(curl -sS -w "\n%{http_code}" -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" \
"$font_url")
if [[ $? -eq 0 ]]; then
http_code=$(print "$response" | tail -n1)
content=$(print "$response" | sed '$d')
if [[ "$http_code" = "200" ]]; then
print "$content" | \
sed "s/fonts\.gstatic\.com/${DISCORD_ACTIVITY_CLIENT_ID}.discordsays.com\/.proxy\/gstatic\/fonts/g" \
>> "$raw_file"
print >> "$raw_file"
else
print "Error: HTTP $http_code for $font_url" >&2
fi
else
print "Error: Failed to fetch $font_url" >&2
fi
done
if [[ -s "$raw_file" ]]; then
mv "$raw_file" "$output_dir/$dir/fonts.css"
print "Generated fonts.css for $dir" >&2
else
touch "$output_dir/$dir/fonts.css"
print "Generated empty fonts.css for $dir (no valid content)" >&2
fi
else
touch "$output_dir/$dir/fonts.css"
print "Generated empty fonts.css for $dir (no URLs found)" >&2
fi
else
touch "$output_dir/$dir/fonts.css"
print "Generated empty fonts.css for $dir (no CSS files)" >&2
fi
done