#!/bin/bash # ---- sys NC=" \033[0m" coerce=false lowercase=false file="" prefix="" original_palette="" verbosity=0 script_help=$( cat < [arg] Flags: -f, --file specify file (mandatory) -v, --verbose increase verbosity by 1 -o, --original-palette the palette used in the based file (given by --file) -l, --lowercase replaces with lowercased hex codes -c, --coerce force the creation of new palette files (useful when those files already exist) -p, --prefix specify which prefix to use for the hex codes. Surround it with double quotes if needed. -h, --help see this message EOF ) palette_names=( storm dusk dawn ) declare -A dusk=( [white]='C6D0F5' [peach]='FAB387' [gray2]='ADB5D8' [black0]='101019' [black1]='181825' [gray1]='959BBA' [blue]='90C1FB' [green]='A6E3A1' [sapphire]='74C7EC' [black3]='323044' [black4]='4B4B62' [black5]='63657F' [teal]='94E2D5' [gray0]='7C809D' [rosewater]='F5E0DC' [maroon]='EBA0AC' [lavender]='C9CBFF' [yellow]='F9E2AF' [flamingo]='F2CDCD' [sky]='89DCEB' [mauve]='CBA6F7' [black2]='1E1E2E' [pink]='F5C2E7' [red]='F38BA8' ) declare -A storm=( [white]='C5CFF5' [sapphire]='34C3DC' [pink]='F5BFE7' [rosewater]='F5DFDA' [black2]='24273A' [flamingo]='F2CBCB' [red]='F67E98' [maroon]='F1949B' [peach]='FEA571' [black1]='1F2233' [sky]='89DCFD' [gray1]='8289AA' [lavender]='C2CBFE' [black3]='2B3045' [green]='A1DF8E' [black4]='3E435E' [yellow]='F1D8A4' [gray2]='A6AFD2' [blue]='83ABF9' [black0]='1A1B26' [gray0]='5F6587' [teal]='85E0D1' [black5]='4F5473' [mauve]='C59FF6' ) declare -A dawn=( [black4]='CCC9D1' [peach]='FE640B' [black3]='E6E3E5' [pink]='EC83D0' [black0]='D3D0D2' [black1]='EDEDED' [blue]='1D65F5' [lavender]='7287FD' [mauve]='822FEE' [black5]='B5B1BF' [maroon]='E63B4A' [rosewater]='DC907F' [green]='40A02B' [gray1]='86819C' [black2]='FBF8F4' [white]='575279' [gray2]='6E6A8B' [sky]='04A5E5' [sapphire]='209FB5' [red]='BB0D33' [teal]='179299' [gray0]='9D99AE' [flamingo]='DD7878' [yellow]='E49320' ) function prompt() { local type=${1} # error, success, warning, info local message=${2} local modifiers=${3} case ${type} in "-e" | "--error") printf "\033[0;31m${modifiers}ERROR: %s${NC}\n" "${message}" ;; "-s" | "--success") printf "\033[0;32m${modifiers}SUCCESS: %s${NC}\n" "${message}" ;; "-w" | "--warning") printf "\033[0;33m${modifiers}WARNING: %s${NC}\n" "${message}" ;; *) if [[ $1 == "-i" || $1 == "--info" ]]; then type="${message}" message=${modifiers} fi printf "\033[0;34m${message}INFO: %s${NC}\n" "${type}" ;; esac } function verbose_print() { # $1 = message # $2 = modifiers if [[ $verbosity -gt 0 ]]; then printf "\033[3;29m${2}%s${NC}\n" "${1}" fi } function make_capitalization_char() { capitalization_char='\U' # uppercase [[ $lowercase == true ]] && { capitalization_char='\L' # lowercase } } function generate_palettes() { new_array=() for val in "${palette_names[@]}"; do [[ "$val" != "$original_palette" ]] && new_array+=("$val") done palette_names=("${new_array[@]}") unset new_array for palette in "${palette_names[@]}"; do printf " GENERATING: \033[3;32m%s${NC}\n" "$palette" local dest_file="${palette}.${file##*.}" prompt -w "creating $dest_file..." "\t• " if [[ -f $dest_file ]]; then if [[ ! $coerce == true ]]; then prompt -e "file '$dest_file' already exists. Use --coerce to force it's replacement" "\t• " exit 1 fi fi cp "$file" "$dest_file" prompt -i "replacing colors..." "\t• " for clr in "${!storm[@]}"; do local curr_color=$(eval "echo \${${original_palette}[$clr]}") local dest_color=$(eval "echo \${${palette}[${clr}]}") verbose_print "modifying ${clr}" "\t + " sed -i "s/${curr_color}/${prefix}${capitalization_char}${dest_color}/gI" "$dest_file" done done } function detect_original_palette() { prompt -w "detecting palette..." original_palette="" for palette in "${palette_names[@]}"; do for clr in "${!storm[@]}"; do if grep --ignore-case -q $(eval "echo \${${palette}[${clr}]}") "$file"; then original_palette=$palette break 2 fi done done if [[ $original_palette == "" ]]; then prompt -e "couldn't detect the original palette" exit 1 else prompt -s "detected '$original_palette'" fi } main() { if [[ ! "$#" -gt 0 ]]; then prompt -e "you must provide at least the file you want to generate the missing palettes from" else local help_used=false while [ "$1" != "" ]; do case $1 in -v | --verbose) verbosity=$((verbosity + 1)) ;; -f | --file) file=$2 shift ;; -o | --original-palette) original_palette=$2 shift ;; -l | --lowercase) lowercase=true ;; -c | --coerce) coerce=true ;; -p | --prefix) prefix=$2 shift ;; -h | --help) help_used=true echo "$script_help" ;; *) echo "ERROR: command ($1) not recognized" ;; esac shift done if [[ $help_used != "true" ]]; then if [[ $file != "" ]]; then [[ -f $file ]] && { prompt "updating colors..." make_capitalization_char if [[ $original_palette != "storm" && $original_palette != "dusk" && $original_palette != "dawn" ]]; then detect_original_palette fi generate_palettes } || prompt -e "file ${1} does not exist" else prompt -e "please profive a file to use a base using the --file flag" fi fi fi } main "$@"