mirror of
https://github.com/taigrr/colorhash.git
synced 2026-04-02 03:08:48 -07:00
add colors starter files
This commit is contained in:
@@ -13,5 +13,5 @@
|
|||||||
|
|
||||||
|
|
||||||
1. take input as bytes
|
1. take input as bytes
|
||||||
1. md5 hash the input
|
1. hash the input
|
||||||
1. use modulo against the sum to choose the color to return from the subset of colors selected.
|
1. use modulo against the sum to choose the color to return from the subset of colors selected.
|
||||||
|
|||||||
133
colors.go
Normal file
133
colors.go
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
package go_colorhash
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
TotalHexColorspace = 16777216
|
||||||
|
)
|
||||||
|
|
||||||
|
// Extended ANSI colors (0-255).
|
||||||
|
var ansi = []int{
|
||||||
|
0x000000, 0x800000, 0x008000, 0x808000, 0x000080, 0x800080, 0x008080,
|
||||||
|
0xC0C0C0, 0x808080, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF,
|
||||||
|
0x00FFFF, 0xFFFFFF, 0x000000, 0x00005F, 0x000087, 0x0000AF, 0x0000D7,
|
||||||
|
0x0000FF, 0x005F00, 0x005F5F, 0x005F87, 0x005FAF, 0x005FD7, 0x005FFF,
|
||||||
|
0x008700, 0x00875F, 0x008787, 0x0087AF, 0x0087D7, 0x0087FF, 0x00AF00,
|
||||||
|
0x00AF5F, 0x00AF87, 0x00AFAF, 0x00AFD7, 0x00AFFF, 0x00D700, 0x00D75F,
|
||||||
|
0x00D787, 0x00D7AF, 0x00D7D7, 0x00D7FF, 0x00FF00, 0x00FF5F, 0x00FF87,
|
||||||
|
0x00FFAF, 0x00FFD7, 0x00FFFF, 0x5F0000, 0x5F005F, 0x5F0087, 0x5F00AF,
|
||||||
|
0x5F00D7, 0x5F00FF, 0x5F5F00, 0x5F5F5F, 0x5F5F87, 0x5F5FAF, 0x5F5FD7,
|
||||||
|
0x5F5FFF, 0x5F8700, 0x5F875F, 0x5F8787, 0x5F87AF, 0x5F87D7, 0x5F87FF,
|
||||||
|
0x5FAF00, 0x5FAF5F, 0x5FAF87, 0x5FAFAF, 0x5FAFD7, 0x5FAFFF, 0x5FD700,
|
||||||
|
0x5FD75F, 0x5FD787, 0x5FD7AF, 0x5FD7D7, 0x5FD7FF, 0x5FFF00, 0x5FFF5F,
|
||||||
|
0x5FFF87, 0x5FFFAF, 0x5FFFD7, 0x5FFFFF, 0x870000, 0x87005F, 0x870087,
|
||||||
|
0x8700AF, 0x8700D7, 0x8700FF, 0x875F00, 0x875F5F, 0x875F87, 0x875FAF,
|
||||||
|
0x875FD7, 0x875FFF, 0x878700, 0x87875F, 0x878787, 0x8787AF, 0x8787D7,
|
||||||
|
0x8787FF, 0x87AF00, 0x87AF5F, 0x87AF87, 0x87AFAF, 0x87AFD7, 0x87AFFF,
|
||||||
|
0x87D700, 0x87D75F, 0x87D787, 0x87D7AF, 0x87D7D7, 0x87D7FF, 0x87FF00,
|
||||||
|
0x87FF5F, 0x87FF87, 0x87FFAF, 0x87FFD7, 0x87FFFF, 0xAF0000, 0xAF005F,
|
||||||
|
0xAF0087, 0xAF00AF, 0xAF00D7, 0xAF00FF, 0xAF5F00, 0xAF5F5F, 0xaF5F87,
|
||||||
|
0xAF5FAF, 0xAF5FD7, 0xAF5FFF, 0xAF8700, 0xAF875F, 0xaF8787, 0xAF87AF,
|
||||||
|
0xAF87D7, 0xAF87FF, 0xAFAF00, 0xAFAF5F, 0xaFAF87, 0xAFAFAF, 0xAFAFD7,
|
||||||
|
0xAFAFFF, 0xAFD700, 0xAFD75F, 0xaFD787, 0xAFD7AF, 0xAFD7D7, 0xAFD7FF,
|
||||||
|
0xAFFF00, 0xAFFF5F, 0xaFFF87, 0xAFFFAF, 0xAFFFD7, 0xAFFFFF, 0xD70000,
|
||||||
|
0xD7005F, 0xD70087, 0xD700AF, 0xD700D7, 0xD700FF, 0xD75F00, 0xD75F5F,
|
||||||
|
0xD75F87, 0xD75FAF, 0xD75FD7, 0xD75FFF, 0xD78700, 0xD7875F, 0xD78787,
|
||||||
|
0xD787AF, 0xD787D7, 0xD787FF, 0xD7AF00, 0xD7AF5F, 0xD7AF87, 0xD7AFAF,
|
||||||
|
0xD7AFD7, 0xD7AFFF, 0xD7D700, 0xD7D75F, 0xD7D787, 0xD7D7AF, 0xD7D7D7,
|
||||||
|
0xD7D7FF, 0xD7FF00, 0xD7FF5F, 0xD7FF87, 0xD7FFAF, 0xD7FFD7, 0xD7FFFF,
|
||||||
|
0xFF0000, 0xFF005F, 0xFF0087, 0xFF00AF, 0xFF00D7, 0xFF00FF, 0xFF5F00,
|
||||||
|
0xFF5F5F, 0xFF5F87, 0xFF5FAF, 0xFF5FD7, 0xFF5FFF, 0xFF8700, 0xFF875F,
|
||||||
|
0xFF8787, 0xFF87AF, 0xFF87D7, 0xFF87FF, 0xFFAF00, 0xFFAF5F, 0xFFAF87,
|
||||||
|
0xFFAFAF, 0xFFAFD7, 0xFFAFFF, 0xFFD700, 0xFFD75F, 0xFFD787, 0xFFD7AF,
|
||||||
|
0xFFD7D7, 0xFFD7FF, 0xFFFF00, 0xFFFF5F, 0xFFFF87, 0xFFFFAF, 0xFFFFD7,
|
||||||
|
0xFFFFFF, 0x080808, 0x121212, 0x1C1C1C, 0x262626, 0x303030, 0x3A3A3A,
|
||||||
|
0x444444, 0x4E4E4E, 0x585858, 0x626262, 0x6C6C6C, 0x767676, 0x808080,
|
||||||
|
0x8A8A8A, 0x949494, 0x9E9E9E, 0xA8A8A8, 0xB2B2B2, 0xBCBCBC, 0xC6C6C6,
|
||||||
|
0xD0D0D0, 0xDADADA, 0xE4E4E4, 0xEEEEEE}
|
||||||
|
|
||||||
|
type Color struct {
|
||||||
|
Value int
|
||||||
|
}
|
||||||
|
|
||||||
|
func RGB(r, g, b int) Color {
|
||||||
|
return Color{Value: r<<16 + g<<8 + b}
|
||||||
|
}
|
||||||
|
func (c Color) GetRed() int {
|
||||||
|
return c.Value >> 16 & 0xFF
|
||||||
|
}
|
||||||
|
func (c Color) GetGreen() int {
|
||||||
|
return c.Value >> 8 & 0xFF
|
||||||
|
}
|
||||||
|
func (c Color) GetBlue() int {
|
||||||
|
return c.Value & 0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateColor(x int) Color {
|
||||||
|
return Color{Value: x % TotalHexColorspace}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Color) ToHex() string {
|
||||||
|
return "#" + fmt.Sprintf("%06X", c.Value)
|
||||||
|
}
|
||||||
|
func (c Color) ToShortHex() string {
|
||||||
|
value := c.Value >> 16 & 0xF
|
||||||
|
value += c.Value >> 8 & 0xF
|
||||||
|
value += c.Value & 0xF
|
||||||
|
return "#" + fmt.Sprintf("%06X", value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func FromHex(h string) (c Color, err error) {
|
||||||
|
h = strings.TrimLeft(h, "#")
|
||||||
|
h = strings.ToLower(h)
|
||||||
|
if strings.HasPrefix(h, "0x") {
|
||||||
|
h = strings.Replace(h, "0x", "", 1)
|
||||||
|
}
|
||||||
|
switch len(h) {
|
||||||
|
case 3:
|
||||||
|
var i int64
|
||||||
|
i, err = strconv.ParseInt(string(h[0])+string(h[0]), 16, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(i)
|
||||||
|
c.Value += int(i << 16)
|
||||||
|
i, err = strconv.ParseInt(string(h[1])+string(h[1]), 16, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Value += int(i << 8)
|
||||||
|
i, err = strconv.ParseInt(string(h[2])+string(h[2]), 16, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Value += int(i)
|
||||||
|
case 6:
|
||||||
|
var i int64
|
||||||
|
i, err = strconv.ParseInt(string(h[0:2]), 16, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(i)
|
||||||
|
c.Value += int(i << 16)
|
||||||
|
i, err = strconv.ParseInt(string(h[2:4]), 16, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Value += int(i << 8)
|
||||||
|
i, err = strconv.ParseInt(string(h[4:6]), 16, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Value += int(i)
|
||||||
|
|
||||||
|
default:
|
||||||
|
err = errors.New("Invalid hex code length")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
88
colors_test.go
Normal file
88
colors_test.go
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
package go_colorhash
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCreateColor(t *testing.T) {
|
||||||
|
tc := []struct {
|
||||||
|
ID string
|
||||||
|
Value int
|
||||||
|
Result int
|
||||||
|
}{{ID: "white", Value: TotalHexColorspace - 1, Result: TotalHexColorspace - 1},
|
||||||
|
{ID: "WraparoundBlack", Value: TotalHexColorspace, Result: 0},
|
||||||
|
{ID: "black", Value: 0, Result: 0},
|
||||||
|
}
|
||||||
|
for _, c := range tc {
|
||||||
|
t.Run(c.ID, func(t *testing.T) {
|
||||||
|
color := CreateColor(c.Value)
|
||||||
|
if color.Value != c.Result {
|
||||||
|
t.Errorf("Expected Value %d, but got %d", c.Result, color.Value)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestToHex(t *testing.T) {
|
||||||
|
tc := []struct {
|
||||||
|
ID string
|
||||||
|
R int
|
||||||
|
G int
|
||||||
|
B int
|
||||||
|
Result string
|
||||||
|
}{{ID: "red", R: 0xFF, G: 0x00, B: 0x00, Result: "#FF0000"},
|
||||||
|
{ID: "black", R: 0, G: 0, B: 0, Result: "#000000"},
|
||||||
|
}
|
||||||
|
for _, c := range tc {
|
||||||
|
t.Run(c.ID, func(t *testing.T) {
|
||||||
|
color := RGB(c.R, c.G, c.B)
|
||||||
|
if color.ToHex() != c.Result {
|
||||||
|
t.Errorf("Expected Value %s, but got %s", c.Result, color.ToHex())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestRGB(t *testing.T) {
|
||||||
|
tc := []struct {
|
||||||
|
ID string
|
||||||
|
R int
|
||||||
|
G int
|
||||||
|
B int
|
||||||
|
Result int
|
||||||
|
}{{ID: "white", R: 255, G: 255, B: 255, Result: TotalHexColorspace - 1},
|
||||||
|
{ID: "black", R: 0, G: 0, B: 0, Result: 0},
|
||||||
|
}
|
||||||
|
for _, c := range tc {
|
||||||
|
t.Run(c.ID, func(t *testing.T) {
|
||||||
|
color := RGB(c.R, c.G, c.B)
|
||||||
|
if color.Value != c.Result {
|
||||||
|
t.Errorf("Expected Value %d, but got %d", c.Result, color.Value)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func TestFromHex(t *testing.T) {
|
||||||
|
tc := []struct {
|
||||||
|
ID string
|
||||||
|
Input string
|
||||||
|
Result string
|
||||||
|
Error error
|
||||||
|
}{{ID: "red", Input: "#F00", Result: "#FF0000", Error: nil},
|
||||||
|
{ID: "red", Input: "#F00000", Result: "#F00000", Error: nil},
|
||||||
|
}
|
||||||
|
for _, c := range tc {
|
||||||
|
t.Run(c.ID, func(t *testing.T) {
|
||||||
|
color, err := FromHex(c.Input)
|
||||||
|
if !errors.Is(err, c.Error) {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if color.ToHex() != c.Result {
|
||||||
|
t.Errorf("Expected Value %s, but got %s", c.Result, color.ToHex())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user