You've already forked snikket-web-portal
37 lines
801 B
Python
37 lines
801 B
Python
import functools
|
|
import hashlib
|
|
import typing
|
|
|
|
import hsluv
|
|
|
|
# This is essentially an implementation of XEP-0392.
|
|
|
|
|
|
RGBf = typing.Tuple[float, float, float]
|
|
|
|
|
|
def clip_rgb(r: float, g: float, b: float) -> RGBf:
|
|
return (
|
|
min(max(r, 0), 1),
|
|
min(max(g, 0), 1),
|
|
min(max(b, 0), 1),
|
|
)
|
|
|
|
|
|
@functools.lru_cache(128)
|
|
def text_to_colour(text: str) -> RGBf:
|
|
MASK = 0xffff
|
|
h = hashlib.sha1()
|
|
h.update(text.encode("utf-8"))
|
|
hue = (int.from_bytes(h.digest()[:2], "little") & MASK) / MASK
|
|
r, g, b = hsluv.hsluv_to_rgb((hue * 360, 75, 60))
|
|
# print(text, cb, cr, r, g, b)
|
|
r, g, b = clip_rgb(r, g, b)
|
|
return r, g, b
|
|
|
|
|
|
def text_to_css(text: str) -> str:
|
|
return "#{:02x}{:02x}{:02x}".format(
|
|
*(round(v * 255) for v in text_to_colour(text))
|
|
)
|