diff --git a/scripts/color_palette_generator.py b/scripts/color_palette_generator.py new file mode 100644 index 0000000..5a2f50f --- /dev/null +++ b/scripts/color_palette_generator.py @@ -0,0 +1,102 @@ +#!/usr/bin/python3 +# +# Generates color palettes based on the specified background/foreground colors. +# +# Usage: python color_palette_generator.py #fg_hex #bg_hex light|dark +# +# The light variant is based on GitHub's style, while the dark variant is based on pre-existing UberWriter styles. +# +# Accessibility is not accounted for, so make sure to verify contrast: https://webaim.org/resources/contrastchecker/ + +import operator +import os +import sys + + +def hex_to_tuple(h): + return tuple(int(h.lstrip('#')[i:i + 2], 16) for i in (0, 2, 4)) + + +def tuple_to_hex(t): + (r, g, b) = t + if r < 0 or g < 0 or b < 0 or r > 255 or g > 255 or b > 255: + return '#%02x%02x%02x (clamped)' % tuple(map(lambda x: max(0, min(x, 255)), t)) + else: + return '#%02x%02x%02x' % t + + +def sub_tuples(t1, t2): + return tuple(map(operator.sub, t1, t2)) + + +if __name__ == '__main__': + if len(sys.argv) != 4: + print("Usage: {} foreground_color background_color light|dark\n" + + "Both colors must be in hexadecimal format, eg. #f6f5f4".format(os.path.basename(__file__))) + exit() + + target_foreground_color = hex_to_tuple(sys.argv[1]) + target_background_color = hex_to_tuple(sys.argv[2]) + dark = sys.argv[3] == "dark" + + gh_text_color = hex_to_tuple("#dbdbdb" if dark else "#24292e") + gh_background_color = hex_to_tuple("#353535" if dark else "#ffffff") + gh_alt_background_color = hex_to_tuple("#3a3a3a" if dark else "#f6f8fa") + gh_link_color = hex_to_tuple("#a2c7f8" if dark else "#0366d6") + gh_blockquote_text_color = hex_to_tuple("#959595" if dark else "#6a737d") + gh_blockquote_border_color = hex_to_tuple("#525252" if dark else "#dfe2e5") + gh_header_border_color = hex_to_tuple("#474747" if dark else "#eaecef") + gh_hr_background_color = hex_to_tuple("#505050" if dark else "#e1e4e8") + gh_table_tr_border_color = hex_to_tuple("#696969" if dark else "#c6cbd1") + gh_table_td_border_color = hex_to_tuple("#525252" if dark else "#dfe2e5") + gh_kbd_text_color = hex_to_tuple("#bbbbbb" if dark else "#444d56") + gh_kbd_background_color = hex_to_tuple("#3c3c3c" if dark else "#fafbfc") + gh_kbd_border_color = hex_to_tuple("#696969" if dark else "#c6cbd1") + gh_kbd_shadow_color = hex_to_tuple("#979797" if dark else "#959da5") + + text_color_diff = sub_tuples(gh_text_color, target_foreground_color) + background_color_diff = sub_tuples(gh_background_color, target_background_color) + + text_color = tuple_to_hex(target_foreground_color) + background_color = tuple_to_hex(target_background_color) + alt_background_color = tuple_to_hex(sub_tuples(gh_alt_background_color, background_color_diff)) + link_color = tuple_to_hex(sub_tuples(gh_link_color, text_color_diff)) + blockquote_text_color = tuple_to_hex(sub_tuples(gh_blockquote_text_color, text_color_diff)) + blockquote_border_color = tuple_to_hex(sub_tuples(gh_blockquote_border_color, background_color_diff)) + header_border_color = tuple_to_hex(sub_tuples(gh_header_border_color, background_color_diff)) + hr_background_color = tuple_to_hex(sub_tuples(gh_hr_background_color, background_color_diff)) + table_tr_border_color = tuple_to_hex(sub_tuples(gh_table_tr_border_color, background_color_diff)) + table_td_border_color = tuple_to_hex(sub_tuples(gh_table_td_border_color, background_color_diff)) + kbd_text_color = tuple_to_hex(sub_tuples(gh_kbd_text_color, text_color_diff)) + kbd_background_color = tuple_to_hex(sub_tuples(gh_kbd_background_color, background_color_diff)) + kbd_border_color = tuple_to_hex(sub_tuples(gh_kbd_border_color, background_color_diff)) + kbd_shadow_color = tuple_to_hex(sub_tuples(gh_kbd_shadow_color, background_color_diff)) + + print(("--text-color: {};\n" + + "--background-color: {};\n" + + "--alt-background-color: {};\n" + + "--link-color: {};\n" + + "--blockquote-text-color: {};\n" + + "--blockquote-border-color: {};\n" + + "--header-border-color: {};\n" + + "--hr-background-color: {};\n" + + "--table-tr-border-color: {};\n" + + "--table-td-border-color: {};\n" + + "--kbd-text-color: {};\n" + + "--kbd-background-color: {};\n" + + "--kbd-border-color: {};\n" + + "--kbd-shadow-color: {};\n").format( + text_color, + background_color, + alt_background_color, + link_color, + blockquote_text_color, + blockquote_border_color, + header_border_color, + hr_background_color, + table_tr_border_color, + table_td_border_color, + kbd_text_color, + kbd_background_color, + kbd_border_color, + kbd_shadow_color))