Last active
May 14, 2023 22:48
-
-
Save kulmajaba/ec0a455daf40beb44c1f963f139c096f to your computer and use it in GitHub Desktop.
Python script to convert rgb, rgba, html color names and malformed hex colors to hex
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
import colorsys | |
# HTML color names supported by browsers | |
color_lookup = { | |
'aliceblue': '#f0f8ff', | |
'antiquewhite': '#faebd7', | |
'aqua': '#00ffff', | |
'aquamarine': '#7fffd4', | |
'azure': '#f0ffff', | |
'beige': '#f5f5dc', | |
'bisque': '#ffe4c4', | |
'black': '#000000', | |
'blanchedalmond': '#ffebcd', | |
'blue': '#0000ff', | |
'blueviolet': '#8a2be2', | |
'brown': '#a52a2a', | |
'burlywood': '#deb887', | |
'cadetblue': '#5f9ea0', | |
'chartreuse': '#7fff00', | |
'chocolate': '#d2691e', | |
'coral': '#ff7f50', | |
'cornflowerblue': '#6495ed', | |
'cornsilk': '#fff8dc', | |
'crimson': '#dc143c', | |
'cyan': '#00ffff', | |
'darkblue': '#00008b', | |
'darkcyan': '#008b8b', | |
'darkgoldenrod': '#b8860b', | |
'darkgrey': '#a9a9a9', | |
'darkgreen': '#006400', | |
'darkkhaki': '#bdb76b', | |
'darkmagenta': '#8b008b', | |
'darkolivegreen': '#556b2f', | |
'darkorange': '#ff8c00', | |
'darkorchid': '#9932cc', | |
'darkred': '#8b0000', | |
'darksalmon': '#e9967a', | |
'darkseagreen': '#8fbc8f', | |
'darkslateblue': '#483d8b', | |
'darkslategrey': '#2f4f4f', | |
'darkturquoise': '#00ced1', | |
'darkviolet': '#9400d3', | |
'deeppink': '#ff1493', | |
'deepskyblue': '#00bfff', | |
'dimgray': '#696969', | |
'dodgerblue': '#1e90ff', | |
'firebrick': '#b22222', | |
'floralwhite': '#fffaf0', | |
'forestgreen': '#228b22', | |
'fuchsia': '#ff00ff', | |
'gainsboro': '#dcdcdc', | |
'ghostwhite': '#f8f8ff', | |
'gold': '#ffd700', | |
'goldenrod': '#daa520', | |
'grey': '#808080', | |
'green': '#008000', | |
'greenyellow': '#adff2f', | |
'honeydew': '#f0fff0', | |
'hotpink': '#ff69b4', | |
'indianred': '#cd5c5c', | |
'indigo': '#4b0082', | |
'ivory': '#fffff0', | |
'khaki': '#f0e68c', | |
'lavender': '#e6e6fa', | |
'lavenderblush': '#fff0f5', | |
'lawngreen': '#7cfc00', | |
'lemonchiffon': '#fffacd', | |
'lightblue': '#add8e6', | |
'lightcoral': '#f08080', | |
'lightcyan': '#e0ffff', | |
'lightgoldenrodyellow': '#fafad2', | |
'lightgrey': '#d3d3d3', | |
'lightgreen': '#90ee90', | |
'lightpink': '#ffb6c1', | |
'lightsalmon': '#ffa07a', | |
'lightseagreen': '#20b2aa', | |
'lightskyblue': '#87cefa', | |
'lightslategrey': '#778899', | |
'lightsteelblue': '#b0c4de', | |
'lightyellow': '#ffffe0', | |
'lime': '#00ff00', | |
'limegreen': '#32cd32', | |
'linen': '#faf0e6', | |
'magenta': '#ff00ff', | |
'maroon': '#800000', | |
'mediumaquamarine': '#66cdaa', | |
'mediumblue': '#0000cd', | |
'mediumorchid': '#ba55d3', | |
'mediumpurple': '#9370d8', | |
'mediumseagreen': '#3cb371', | |
'mediumslateblue': '#7b68ee', | |
'mediumspringgreen': '#00fa9a', | |
'mediumturquoise': '#48d1cc', | |
'mediumvioletred': '#c71585', | |
'midnightblue': '#191970', | |
'mintcream': '#f5fffa', | |
'mistyrose': '#ffe4e1', | |
'moccasin': '#ffe4b5', | |
'navajowhite': '#ffdead', | |
'navy': '#000080', | |
'oldlace': '#fdf5e6', | |
'olive': '#808000', | |
'olivedrab': '#6b8e23', | |
'orange': '#ffa500', | |
'orangered': '#ff4500', | |
'orchid': '#da70d6', | |
'palegoldenrod': '#eee8aa', | |
'palegreen': '#98fb98', | |
'paleturquoise': '#afeeee', | |
'palevioletred': '#d87093', | |
'papayawhip': '#ffefd5', | |
'peachpuff': '#ffdab9', | |
'peru': '#cd853f', | |
'pink': '#ffc0cb', | |
'plum': '#dda0dd', | |
'powderblue': '#b0e0e6', | |
'purple': '#800080', | |
'red': '#ff0000', | |
'rosybrown': '#bc8f8f', | |
'royalblue': '#4169e1', | |
'saddlebrown': '#8b4513', | |
'salmon': '#fa8072', | |
'sandybrown': '#f4a460', | |
'seagreen': '#2e8b57', | |
'seashell': '#fff5ee', | |
'sienna': '#a0522d', | |
'silver': '#c0c0c0', | |
'skyblue': '#87ceeb', | |
'slateblue': '#6a5acd', | |
'slategrey': '#708090', | |
'snow': '#fffafa', | |
'springgreen': '#00ff7f', | |
'steelblue': '#4682b4', | |
'tan': '#d2b48c', | |
'teal': '#008080', | |
'thistle': '#d8bfd8', | |
'tomato': '#ff6347', | |
'turquoise': '#40e0d0', | |
'violet': '#ee82ee', | |
'wheat': '#f5deb3', | |
'white': '#ffffff', | |
'whitesmoke': '#f5f5f5', | |
'yellow': '#ffff00', | |
'yellowgreen': '#9acd32' | |
} | |
# #ababab | |
def fill_hex(hex): | |
filled_hex = hex[1:] | |
if len(filled_hex) < 6: | |
filled_hex = '' | |
for char in hex[1:]: | |
filled_hex += char + char | |
return f'#{filled_hex[0:6]}'.lower() | |
def name_to_hex(name): | |
try: | |
return color_lookup[name.lower()] | |
except KeyError: | |
print(f'No color found for string {repr(name)}') | |
return None | |
def rgb_to_hex(rgb): | |
hex = '%02x%02x%02x' % rgb | |
return hex | |
# rgb(99, 99, 99) | |
# rgba(00, 99, 99, 0.4) | |
# Will not handle fancy computations | |
def rgb_string_to_hex(rgb_string): | |
rgb_arr = re.findall(r'(?:0\.){0,1}\d+', rgb_string)[0:3] | |
try: | |
rgb = tuple(int(item) for item in rgb_arr) | |
hex = rgb_to_hex(rgb) | |
return f'#{hex}'.lower() | |
except Exception as e: | |
print(e) | |
print(repr(rgb_string)) | |
print(rgb_arr) | |
return None | |
# hsl(99, 99, 99) | |
# hsla(00, 99, 99, 0.4) | |
# Will not handle fancy computations | |
def hsl_string_to_hex(hsl_string): | |
hsl_arr = re.findall(r'(?:0\.){0,1}\d+', hsl_string)[0:3] | |
try: | |
rgb = colorsys.hls_to_rgb(int(hsl_arr[0])/360, int(hsl_arr[2])/100, int(hsl_arr[1])/100) | |
rgb = tuple(int(item) for item in rgb) | |
hex = rgb_to_hex(rgb) | |
return f'#{hex}'.lower() | |
except Exception as e: | |
print(e) | |
print(repr(hsl_string)) | |
print(hsl_arr) | |
return None | |
res = [] | |
f = open('all colors unclean.txt', 'r') | |
for line in f: | |
color = line.strip() | |
try: | |
hex = None | |
# Hex colors | |
if color.startswith('#'): | |
hex = fill_hex(color) | |
# RGB/A colors | |
elif color.startswith('rgb'): | |
hex = rgb_string_to_hex(color) | |
# RGB/A colors | |
elif color.startswith('hsl'): | |
hex = hsl_string_to_hex(color) | |
# Color doesn't match the other formats, try to find the string in color lookup | |
# If no match is found, the string is returned as is | |
else: | |
hex = name_to_hex(color) | |
if hex != None: | |
res.append(hex) | |
else: | |
print(f'Did not parse {repr(color)}') | |
except Exception as e: | |
print(e) | |
print(repr(color)) | |
f.close() | |
with open('all colors hexed.txt', 'w') as w: | |
w.write('\n'.join(res)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment