feat(color): automated black or white foreground
This commit is contained in:
parent
66fc4f3b3e
commit
d9fa2af9e5
1 changed files with 74 additions and 3 deletions
|
|
@ -40,6 +40,70 @@ class N:
|
||||||
return self.args_list
|
return self.args_list
|
||||||
|
|
||||||
|
|
||||||
|
class Color:
|
||||||
|
|
||||||
|
def ansi2rgb(ansi):
|
||||||
|
if 232 <= ansi and ansi <= 255:
|
||||||
|
# Greyscale domain.
|
||||||
|
R = (ansi - 232) * 10 + 8
|
||||||
|
G = R
|
||||||
|
B = R
|
||||||
|
elif 0 <= ansi and ansi <= 15:
|
||||||
|
# Default 16 colors.
|
||||||
|
ansi_16 = [(0,0,0),(128,0,0),(0,128,0),(128,128,0),(0,0,128),(128,0,128),(0,128,128),(192,192,192),(80,80,80),(255,0,0),(0,255,0),(255,255,0),(0,0,255),(255,0,255),(0,255,255),(255,255,255)]
|
||||||
|
R,G,B = ansi_16[ansi]
|
||||||
|
else:
|
||||||
|
iR = (ansi - 16) / 36
|
||||||
|
if iR > 0:
|
||||||
|
R = 55 + iR*40
|
||||||
|
else:
|
||||||
|
R = 0
|
||||||
|
|
||||||
|
iG = (ansi-16) % 36 / 6
|
||||||
|
if iG > 0:
|
||||||
|
G = 55 + iG*40
|
||||||
|
else:
|
||||||
|
G = 0
|
||||||
|
|
||||||
|
iB = (ansi-16) % 6
|
||||||
|
if iB > 0:
|
||||||
|
B = 55 + iB*40
|
||||||
|
else:
|
||||||
|
B = 0
|
||||||
|
|
||||||
|
return R,G,B
|
||||||
|
|
||||||
|
def lum(dC):
|
||||||
|
"""Linearize an RGB component."""
|
||||||
|
if dC <= 0.03928:
|
||||||
|
return dC / 12.92
|
||||||
|
else:
|
||||||
|
return pow( (dC + 0.055)/1.055 , 2.4)
|
||||||
|
|
||||||
|
def luminance(R, G, B):
|
||||||
|
"""RGB linear (reljative) luminance."""
|
||||||
|
dR = R / 255
|
||||||
|
dG = G / 255
|
||||||
|
dB = B / 255
|
||||||
|
|
||||||
|
lR = Color.lum(dR)
|
||||||
|
lG = Color.lum(dG)
|
||||||
|
lB = Color.lum(dB)
|
||||||
|
|
||||||
|
return 0.2126 * lR + 0.7152 * lG + 0.0722 * lB
|
||||||
|
|
||||||
|
def lightness(luminance):
|
||||||
|
"""Perceived lightness in [0,100] (i.e. [darkest, lightest])."""
|
||||||
|
if luminance < 216/24389:
|
||||||
|
return luminance * 24389 / 27
|
||||||
|
else:
|
||||||
|
return pow(luminance, 1/3) * 116 - 16
|
||||||
|
|
||||||
|
def ansi_lightness(ansi):
|
||||||
|
R,G,B = Color.ansi2rgb(ansi)
|
||||||
|
return Color.lightness(Color.luminance(R,G,B))
|
||||||
|
|
||||||
|
|
||||||
class Message:
|
class Message:
|
||||||
def __init__(self, notification):
|
def __init__(self, notification):
|
||||||
# print("Notification")
|
# print("Notification")
|
||||||
|
|
@ -70,16 +134,23 @@ class Message:
|
||||||
"date": "21",
|
"date": "21",
|
||||||
"summary": "254",
|
"summary": "254",
|
||||||
"body": "242",
|
"body": "242",
|
||||||
|
"none": "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
self.style = {"none": "black"}
|
self.style = {}
|
||||||
for k in self.color:
|
for k in self.color:
|
||||||
self.style[k] = f"color({self.color[k]})"
|
self.style[k] = f"color({self.color[k]})"
|
||||||
|
|
||||||
def print_segment(self, key, text, console):
|
def print_segment(self, key, text, console):
|
||||||
console.print("", style=f"{self.last_color} on {self.style[key]}", end="")
|
console.print("", style=f"{self.last_color} on {self.style[key]}", end="")
|
||||||
# FIXME automated black or white
|
|
||||||
console.print(text, style=f"black on {self.style[key]}", end="")
|
# Automated black or white foreground.
|
||||||
|
if Color.ansi_lightness(int(self.color[key])) >= 50:
|
||||||
|
fg = "black"
|
||||||
|
else:
|
||||||
|
fg = "white"
|
||||||
|
console.print(text, style=f"{fg} on {self.style[key]}", end="")
|
||||||
|
|
||||||
self.last_color = f"{self.style[key]}"
|
self.last_color = f"{self.style[key]}"
|
||||||
|
|
||||||
def print_on(self, console = Console()):
|
def print_on(self, console = Console()):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue