diff --git a/bin/omarchy-theme-regenerate-colors-from-alacritty b/bin/omarchy-theme-regenerate-colors-from-alacritty new file mode 100755 index 0000000000..019dd5df1a --- /dev/null +++ b/bin/omarchy-theme-regenerate-colors-from-alacritty @@ -0,0 +1,207 @@ +#!/bin/bash + +set -e + +THEME_SOURCE="${1:-}" +COLORS_OUTPUT="$THEME_SOURCE/colors.toml" +ALACRITTY_FILE="$THEME_SOURCE/alacritty.toml" + +if [[ -z $THEME_SOURCE ]]; then + echo "Usage: omarchy-theme-regenerate-colors-from-alacritty " >&2 + exit 1 +fi + +# Skip if colors.toml already exists in source theme +if [[ -f $COLORS_OUTPUT ]]; then + exit 0 +fi + +# Skip if no alacritty.toml to extract from +if [[ ! -f $ALACRITTY_FILE ]]; then + exit 0 +fi + +normalize_hex() { + local color="$1" + [[ -z $color ]] && return + color="${color#0x}" + color="${color#\#}" + if [[ $color =~ ^[0-9a-fA-F]{6}$ ]]; then + printf "#%s\n" "${color,,}" + fi +} + +extract_color_in_section() { + local section="$1" + local key="$2" + local color_hex="" + color_hex=$(awk -v section="$section" -v key="$key" ' + function trim(value) { + gsub(/^[ \t]+|[ \t]+$/, "", value) + return value + } + + function strip_comment(value, i, ch, out, in_single, in_double, prev) { + out = "" + in_single = 0 + in_double = 0 + prev = "" + + for (i = 1; i <= length(value); i++) { + ch = substr(value, i, 1) + + if (ch == "\"" && !in_single && prev != "\\") { + in_double = !in_double + } else if (ch == "'\''" && !in_double) { + in_single = !in_single + } + + if (ch == "#" && !in_single && !in_double) { + break + } + + out = out ch + prev = ch + } + + gsub(/[ \t]+$/, "", out) + return out + } + + /^[ \t]*\[/ { + in_section = ($0 ~ "^[ \\t]*\\[" section "\\][ \\t]*$") + next + } + + in_section { + line = $0 + line = strip_comment(line) + + split_pos = index(line, "=") + if (split_pos == 0) { + next + } + + current_key = trim(substr(line, 1, split_pos - 1)) + current_value = trim(substr(line, split_pos + 1)) + + if (current_key == key) { + gsub(/["'\''#]/, "", current_value) + sub(/^0[xX]/, "", current_value) + if (current_value ~ /^[0-9A-Fa-f]{6}$/) { + print current_value + exit + } + } + } + ' "$ALACRITTY_FILE") + + if [[ -n $color_hex && $color_hex =~ ^[0-9a-fA-F]{6}$ ]]; then + normalize_hex "$color_hex" + fi + + return 0 +} + +names=(black red green yellow blue magenta cyan white) + +# Extract normal colors (color0-7) +for i in {0..7}; do + name="${names[$i]}" + val=$(extract_color_in_section "colors.normal" "$name") + if [[ -z $val ]]; then + val=$(extract_color_in_section "colors" "normal.$name") + fi + + printf -v "color$i" "%s" "$val" +done + +# Validate we have all normal colors (required) +for c in color0 color1 color2 color3 color4 color5 color6 color7; do + if [[ -z ${!c} ]]; then + echo "Warning: Cannot extract all normal colors from $ALACRITTY_FILE, skipping generation" >&2 + exit 0 + fi +done + +# Extract bright colors (color8-15) +for i in {0..7}; do + normal="color$i" + bright="color$((i + 8))" + name="${names[$i]}" + + val=$(extract_color_in_section "colors.bright" "$name") + if [[ -z $val ]]; then + val=$(extract_color_in_section "colors" "bright.$name") + fi + + printf -v "$bright" "%s" "${val:-${!normal}}" +done + +# Extract primary colors +background=$(extract_color_in_section "colors.primary" "background") +foreground=$(extract_color_in_section "colors.primary" "foreground") + +if [[ -z $background ]]; then + background=$(extract_color_in_section "colors" "primary.background") +fi + +if [[ -z $foreground ]]; then + foreground=$(extract_color_in_section "colors" "primary.foreground") +fi + +# Extract cursor color (from [colors.cursor] section) +cursor=$(extract_color_in_section "colors.cursor" "cursor") + +if [[ -z $cursor ]]; then + cursor=$(extract_color_in_section "colors" "cursor.cursor") +fi + +# Extract selection colors +selection_background=$(extract_color_in_section "colors.selection" "background") + +if [[ -z $selection_background ]]; then + selection_background=$(extract_color_in_section "colors" "selection.background") +fi + +selection_foreground=$(extract_color_in_section "colors.selection" "text") + +if [[ -z $selection_foreground ]]; then + selection_foreground=$(extract_color_in_section "colors" "selection.text") +fi + +# Apply defaults +background=${background:-$color0} +foreground=${foreground:-$color7} +cursor=${cursor:-$foreground} +selection_background=${selection_background:-$foreground} +selection_foreground=${selection_foreground:-$background} +accent=$color4 + +mkdir -p "$THEME_SOURCE" + +cat > "$COLORS_OUTPUT" </dev/null cp -r "$USER_THEMES_PATH/$THEME_NAME/"* "$NEXT_THEME_PATH/" 2>/dev/null +# Generate colors.toml from alacritty.toml if theme is missing colors.toml +if [[ ! -f $NEXT_THEME_PATH/colors.toml && -f $NEXT_THEME_PATH/alacritty.toml ]]; then + omarchy-theme-regenerate-colors-from-alacritty "$NEXT_THEME_PATH" +fi + # Generate dynamic configs omarchy-theme-set-templates