Files
Tablequizwiki/lib/utils.py
Holger Sielaff 030d3c8059 initial
2024-07-03 21:41:03 +02:00

59 lines
1.5 KiB
Python

import logging
import math
import re
import matplotlib
from django.db import models
from django.utils.safestring import mark_safe
re_hex = re.compile("^([0-9a-f]{3,6})(\W)?", re.IGNORECASE)
def hex2rgb(hexval):
return matplotlib.colors.to_rgb(hexval)
def light_or_dark(rgbColor, colors: tuple = ('#FFFFFF', '#333333')):
if isinstance(rgbColor, str):
rgbColor = hex2rgb(rgbColor)
[r, g, b] = rgbColor
val = 0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b)
hsp = math.sqrt(val)
# logging.error([rgbColor, val, hsp])
# if hsp > 127.5:
if hsp > .5:
# light
return colors[1]
else:
# dark
return colors[0]
def invert_hex(hexval: str):
def _invert(content):
text = content.group(1).lower()
code = {}
l1 = "0123456789abcdef"
l2 = "fedcba9876543210"
for i in range(len(l1)):
code[l1[i]] = l2[i]
inverted = ""
for j in text:
inverted += code[j]
return inverted
prepend_hash = ''
if hexval.startswith('#'):
hexval = hexval[1:]
prepend_hash = '#'
return prepend_hash + re_hex.sub(_invert, hexval)
def color_label(instance: models.Model, value:str=None):
value = value or instance.color
return mark_safe(f'<div style="padding:.5em 1em;display:inline-block;background-color:{instance.color};border-radius:5px;'
# f'color:{invert_hex(instance.color)};'
f'color:{light_or_dark(instance.color)};'
f'">{value}</div>')