mirror of
https://github.com/6543/go-hexcolor
synced 2024-12-18 15:54:17 +00:00
Add string/color.RGBA to HexColor
This commit is contained in:
parent
88c3f96e47
commit
d25019851f
100
hexcolor.go
Normal file
100
hexcolor.go
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
package go_hexcolor
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"image/color"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HexColor represents a single hex color
|
||||||
|
type HexColor struct {
|
||||||
|
original string
|
||||||
|
hex string
|
||||||
|
}
|
||||||
|
|
||||||
|
// The compiled regular expression used to test the validity of a color statement
|
||||||
|
var (
|
||||||
|
hexDefault *regexp.Regexp
|
||||||
|
hexShort *regexp.Regexp
|
||||||
|
)
|
||||||
|
|
||||||
|
// The raw regular expression string used for testing the validity
|
||||||
|
const (
|
||||||
|
hexDefaultRaw string = `[0-9a-f]{6}`
|
||||||
|
hexShortRaw string = `[0-9a-f]{3}`
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
hexDefault = regexp.MustCompile("^" + hexDefaultRaw + "$")
|
||||||
|
hexShort = regexp.MustCompile("^" + hexShortRaw + "$")
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewHexColor convert string into a HexColor
|
||||||
|
func NewHexColor(hc string) (*HexColor, error) {
|
||||||
|
c := &HexColor{original: hc}
|
||||||
|
hc = strings.TrimLeft(strings.ToLower(hc), "#")
|
||||||
|
|
||||||
|
if hexDefault.MatchString(hc) {
|
||||||
|
c.hex = hc
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
if hexShort.MatchString(hc) {
|
||||||
|
c.hex = hc[:1] + hc[:1] + hc[1:][:1] + hc[1:][:1] + hc[2:] + hc[2:]
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle named colors
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("Malformed color: %s", hc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToString return normalized hex code of color
|
||||||
|
func (c *HexColor) ToString() string {
|
||||||
|
if c == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return c.hex
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToRGBA return RGBA color
|
||||||
|
func (c *HexColor) ToRGBA() (*color.RGBA, error) {
|
||||||
|
if c == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
rr, err := strconv.ParseUint(c.hex[:2], 16, 8)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
gg, err := strconv.ParseUint(c.hex[2:][:2], 16, 8)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
bb, err := strconv.ParseUint(c.hex[4:], 16, 8)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &color.RGBA{
|
||||||
|
R: uint8(rr),
|
||||||
|
G: uint8(gg),
|
||||||
|
B: uint8(bb),
|
||||||
|
A: 0xff,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToHexColor convert RGBA to HexColor
|
||||||
|
func ToHexColor(c *color.RGBA) *HexColor {
|
||||||
|
toS := func(i uint8) string {
|
||||||
|
h := fmt.Sprintf("%x", i)
|
||||||
|
if len(h) == 1 {
|
||||||
|
h = "0" + h
|
||||||
|
}
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
return &HexColor{
|
||||||
|
original: fmt.Sprintf("%v", c),
|
||||||
|
hex: toS(c.R) + toS(c.G) + toS(c.B),
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user