-
-
Notifications
You must be signed in to change notification settings - Fork 13
/
color.go
97 lines (82 loc) · 2.04 KB
/
color.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package core
import (
"fmt"
"strconv"
"github.com/muesli/termenv"
)
const (
LAST_RESERVED_COLOR_ID = 10_000 // not definitive
rgb24 colorEncodingId = iota + 1
ansiColor
ansiColor256
)
// A Color represents a color in a given encoding.
type Color struct {
data [6]byte
encodingId colorEncodingId
}
type colorEncodingId uint16
func (id colorEncodingId) IsReserved() bool {
return id <= LAST_RESERVED_COLOR_ID
}
func ColorFromAnsiColor(c termenv.ANSIColor) Color {
return Color{
data: [6]byte{byte(c)},
encodingId: ansiColor,
}
}
func ColorFromAnsi256Color(c termenv.ANSI256Color) Color {
return Color{
data: [6]byte{byte(c)},
encodingId: ansiColor256,
}
}
func ColorFromRGB24(r, g, b byte) Color {
return Color{
data: [6]byte{r, g, b},
encodingId: rgb24,
}
}
func ColorFromTermenvColor(c termenv.Color, defaultColor ...Color) Color {
switch color := c.(type) {
case termenv.ANSIColor:
return ColorFromAnsiColor(color)
case termenv.ANSI256Color:
return ColorFromAnsi256Color(color)
case termenv.RGBColor:
r, g, b := termenv.ConvertToRGB(color).RGB255()
return ColorFromRGB24(r, g, b)
case termenv.NoColor:
if len(defaultColor) == 0 {
panic(ErrUnreachable)
}
return defaultColor[0]
default:
panic(ErrUnreachable)
}
}
func (c Color) ToTermColor() termenv.Color {
switch c.encodingId {
case ansiColor:
return termenv.ANSIColor(c.data[0])
case ansiColor256:
return termenv.ANSI256Color(c.data[0])
case rgb24:
b := [7]byte{'#'}
strconv.AppendUint(b[1:1:3], uint64(c.data[0]), 16)
strconv.AppendUint(b[3:3:5], uint64(c.data[1]), 16)
strconv.AppendUint(b[5:5:7], uint64(c.data[2]), 16)
return termenv.RGBColor(string(b[:]))
default:
panic(fmt.Errorf("invalid or unsupported color id: %d", c.encodingId))
}
}
func (c Color) GetAnsiEscapeSequence(background bool) []byte {
return GetFullColorSequence(c.ToTermColor(), background)
}
func (c Color) IsDarkBackgroundColor() bool {
termColor := c.ToTermColor()
rgb := termenv.ConvertToRGB(termColor)
_, _, l := rgb.Hsl()
return l < 0.5
}