Source code for jdna.utils
"""
misc utilities
"""
import random
import webcolors
from colorama import Fore, Style, Back
colors_rgb = {}
for c in vars(Fore):
try:
colors_rgb[c] = webcolors.name_to_rgb(c)
except:
pass
colors_rgb
def rgb_to_hex(r, g, b):
def clamp(x):
return max(0, min(x, 255))
return "#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b))
[docs]def hex_to_color_name(h):
"""Get closest named color for terminal printing"""
distance = 3 * 255 ** 2 + 1
color = None
for name, rgb in colors_rgb.items():
rgb2 = webcolors.hex_to_rgb(h)
d = 0
for _c in ["red", "green", "blue"]:
d += (getattr(rgb2, _c) - getattr(rgb, _c)) ** 2
if d < distance:
distance = d
color = name
return color
[docs]def _colored(text, hex_color, fore_or_back):
"""Return colored text"""
if hex_color is None:
return text
try:
color_name = hex_to_color_name(hex_color)
except ValueError:
color_name = hex_color
s = "{color}{text}{end}".format(
color=getattr(fore_or_back, color_name.upper()), text=text, end=Style.RESET_ALL
)
return s
[docs]def colored(text, hex_color):
"""Return colored text"""
return _colored(text, hex_color, Fore)
[docs]def colored_background(text, hex_color):
"""Return colored text"""
return _colored(text, hex_color, Back)
def random_color():
rgb = [int(random.random() * 255) for x in range(3)]
return rgb_to_hex(*rgb)