#!/bin/zsh FILE="$1" HEADER="$2" MODFILE="$3" IFS="$IFS;!}{.:" STYLESHEET_AR=($(< "$FILE")) STYLESHEET="$(< "$FILE")" typeset -A colorcnt typeset -A varnames for i in ${(Mc)${STYLESHEET_AR}:#\#??????} ${(Mc)STYLESHEET_AR:#\#???}; do colorcnt[$i]=$(( ${colorcnt[$i]:-0} + 1 )) done for k i in ${(@kv)colorcnt}; do local KEY="$(< /dev/urandom tr -dc A-Za-z0-9 | head -c 32)" typeset -a arr if [ ${#k} -eq 7 ]; then arr=(${k:1:2} ${k:3:2} ${k:5:2}) elif [ ${#k} -eq 4 ]; then arr=("${k[2]}0" "${k[3]}0" "${k[4]}0") fi if [ ${#varnames} -gt 0 ]; then for name val in ${(@kv)varnames}; do skip=0 local -a red=($(( 0x${val:0:2} )) $(( 0x${arr[1]} ))) local -a green=($(( 0x${val:2:2} )) $(( 0x${arr[2]} ))) local -a blue=($(( 0x${val:4:2} )) $(( 0x${arr[3]} ))) for m x in ${(nO)red} ${(nO)green} ${(nO)blue}; do [ "$(( $m - $x ))" -gt 5 ] && skip=1 && break done [ $skip -eq 0 ] && <<< "Deduplicated #${(j::)arr} as #${val}" >&2 && break done if [ $skip -eq 0 ]; then STYLESHEET="$(<<< "$STYLESHEET" sed s/\\"$k"/"var(--$name)"/g)" <<< "Set $k as $name" >&2 else STYLESHEET="$(<<< "$STYLESHEET" sed s/\\"$k"/"var(--$KEY)"/g)" <<< "Set $k as $KEY" >&2 varnames[$KEY]="${(j::)arr}" fi else STYLESHEET="$(<<< "$STYLESHEET" sed s/\\"$k"/"var(--$KEY)"/g)" <<< "Set $k as $KEY" >&2 varnames[$KEY]="${(j::)arr}" fi done ( <<< ":root {" typeset -a sortname for name in ${(@nk)varnames}; do <<< $'\t'"--$name: #${varnames[$name]};" done <<< "}" ) > "$HEADER" <<< "$STYLESHEET" > "$MODFILE"