Skip to content

Commit 3986cfd

Browse files
committed
feat: add more convert methods on Color
1 parent 5f87df4 commit 3986cfd

File tree

6 files changed

+92
-28
lines changed

6 files changed

+92
-28
lines changed

.github/workflows/release.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
strategy:
1414
fail-fast: true
1515
matrix:
16-
go: [1.14]
16+
go: [1.16]
1717

1818
steps:
1919
- name: Checkout

color_16.go

+45-1
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@ func (o Opts) String() string {
4242
*************************************************************/
4343

4444
// Base value for foreground/background color
45+
// base: fg 30~37, bg 40~47
46+
// light: fg 90~97, bg 100~107
4547
const (
4648
FgBase uint8 = 30
4749
BgBase uint8 = 40
48-
// hi color base code
50+
4951
HiFgBase uint8 = 90
5052
HiBgBase uint8 = 100
5153
)
@@ -240,6 +242,7 @@ func (c Color) Println(a ...interface{}) {
240242
}
241243

242244
// Light current color. eg: 36(FgCyan) -> 96(FgLightCyan).
245+
//
243246
// Usage:
244247
// lightCyan := Cyan.Light()
245248
// lightCyan.Print("message")
@@ -254,6 +257,7 @@ func (c Color) Light() Color {
254257
}
255258

256259
// Darken current color. eg. 96(FgLightCyan) -> 36(FgCyan)
260+
//
257261
// Usage:
258262
// cyan := LightCyan.Darken()
259263
// cyan.Print("message")
@@ -291,6 +295,26 @@ func (c Color) C256() Color256 {
291295
return Color256{val}
292296
}
293297

298+
// ToFg always convert fg
299+
func (c Color) ToFg() Color {
300+
val := uint8(c)
301+
// is option code, don't change
302+
if val < 10 {
303+
return c
304+
}
305+
return Color(Bg2Fg(val))
306+
}
307+
308+
// ToBg always convert bg
309+
func (c Color) ToBg() Color {
310+
val := uint8(c)
311+
// is option code, don't change
312+
if val < 10 {
313+
return c
314+
}
315+
return Color(Fg2Bg(val))
316+
}
317+
294318
// RGB convert 16 color to 256-color code.
295319
func (c Color) RGB() RGBColor {
296320
val := uint8(c)
@@ -426,6 +450,26 @@ var (
426450
}
427451
)
428452

453+
// Bg2Fg bg color value to fg value
454+
func Bg2Fg(val uint8) uint8 {
455+
if val >= BgBase && val <= 47 { // is bg
456+
val = val - 10
457+
} else if val >= HiBgBase && val <= 107 { // is hi bg
458+
val = val - 10
459+
}
460+
return val
461+
}
462+
463+
// Fg2Bg fg color value to bg value
464+
func Fg2Bg(val uint8) uint8 {
465+
if val >= FgBase && val <= 37 { // is fg
466+
val = val + 10
467+
} else if val >= HiFgBase && val <= 97 { // is hi fg
468+
val = val + 10
469+
}
470+
return val
471+
}
472+
429473
// Basic2nameMap data
430474
func Basic2nameMap() map[uint8]string {
431475
return basic2nameMap

color_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,17 @@ func TestColor16(t *testing.T) {
333333
is.True(ok)
334334
}
335335

336+
func TestColor_convert(t *testing.T) {
337+
assert.Equal(t, "36", Cyan.ToFg().Code())
338+
assert.Equal(t, "46", Cyan.ToBg().Code())
339+
assert.Equal(t, "46", BgCyan.ToBg().Code())
340+
assert.Equal(t, "36", BgCyan.ToFg().Code())
341+
342+
assert.Equal(t, "106", HiCyan.ToBg().Code())
343+
assert.Equal(t, "93", BgHiYellow.ToFg().Code())
344+
assert.Equal(t, "105", BgHiMagenta.ToBg().Code())
345+
}
346+
336347
func TestColor_C256(t *testing.T) {
337348
assert.True(t, Bold.C256().IsEmpty())
338349

convert.go

+26-18
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,15 @@ var (
4040
35: "c839c5", // magenta
4141
36: "20c5c6", // cyan
4242
37: "c7c7c7", // white
43-
40: "000000", // black
44-
41: "c51e14", // red
45-
42: "1dc121", // green
46-
43: "c7c329", // yellow
47-
44: "0a2fc4", // blue
48-
45: "c839c5", // magenta
49-
46: "20c5c6", // cyan
50-
47: "c7c7c7", // white
43+
// - don't add bg color
44+
// 40: "000000", // black
45+
// 41: "c51e14", // red
46+
// 42: "1dc121", // green
47+
// 43: "c7c329", // yellow
48+
// 44: "0a2fc4", // blue
49+
// 45: "c839c5", // magenta
50+
// 46: "20c5c6", // cyan
51+
// 47: "c7c7c7", // white
5152
90: "686868", // lightBlack/darkGray
5253
91: "fd6f6b", // lightRed
5354
92: "67f86f", // lightGreen
@@ -56,14 +57,15 @@ var (
5657
95: "fd7cfc", // lightMagenta
5758
96: "68fdfe", // lightCyan
5859
97: "ffffff", // lightWhite
59-
100: "686868", // lightBlack/darkGray
60-
101: "fd6f6b", // lightRed
61-
102: "67f86f", // lightGreen
62-
103: "fffa72", // lightYellow
63-
104: "6a76fb", // lightBlue
64-
105: "fd7cfc", // lightMagenta
65-
106: "68fdfe", // lightCyan
66-
107: "ffffff", // lightWhite
60+
// - don't add bg color
61+
// 100: "686868", // lightBlack/darkGray
62+
// 101: "fd6f6b", // lightRed
63+
// 102: "67f86f", // lightGreen
64+
// 103: "fffa72", // lightYellow
65+
// 104: "6a76fb", // lightBlue
66+
// 105: "fd7cfc", // lightMagenta
67+
// 106: "68fdfe", // lightCyan
68+
// 107: "ffffff", // lightWhite
6769
}
6870
// will convert data from basic2hexMap
6971
hex2basicMap = initHex2basicMap()
@@ -467,12 +469,18 @@ func RgbToHex(rgb []int) string {
467469

468470
// Basic2hex convert basic color to hex string.
469471
func Basic2hex(val uint8) string {
472+
val = Fg2Bg(val)
470473
return basic2hexMap[val]
471474
}
472475

473476
// Hex2basic convert hex string to basic color code.
474-
func Hex2basic(hex string) uint8 {
475-
return hex2basicMap[hex]
477+
func Hex2basic(hex string, asBg ...bool) uint8 {
478+
val := hex2basicMap[hex]
479+
480+
if len(asBg) > 0 && asBg[0] {
481+
return Fg2Bg(val)
482+
}
483+
return val
476484
}
477485

478486
// Rgb2basic alias of the RgbToAnsi()

convert_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ func TestRgb2basic(t *testing.T) {
1414
}
1515

1616
func TestHex2basic(t *testing.T) {
17-
assert.Equal(t, uint8(105), Hex2basic("fd7cfc"))
17+
assert.Equal(t, uint8(95), Hex2basic("fd7cfc"))
18+
assert.Equal(t, uint8(105), Hex2basic("fd7cfc", true))
1819
}
1920

2021
func TestHslToRgb(t *testing.T) {

utils.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,13 @@ func Text(s string) string {
120120
}
121121

122122
// Uint8sToInts convert []uint8 to []int
123-
func Uint8sToInts(u8s []uint8 ) []int {
124-
ints := make([]int, len(u8s))
125-
for i, u8 := range u8s {
126-
ints[i] = int(u8)
127-
}
128-
return ints
129-
}
123+
// func Uint8sToInts(u8s []uint8 ) []int {
124+
// ints := make([]int, len(u8s))
125+
// for i, u8 := range u8s {
126+
// ints[i] = int(u8)
127+
// }
128+
// return ints
129+
// }
130130

131131
/*************************************************************
132132
* helper methods for print

0 commit comments

Comments
 (0)