color_conversion 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +20 -0
- data/Gemfile +4 -0
- data/Guardfile +9 -0
- data/LICENSE.txt +22 -0
- data/README.md +67 -0
- data/Rakefile +22 -0
- data/color_conversion.gemspec +31 -0
- data/lib/color_conversion.rb +20 -0
- data/lib/color_conversion/color.rb +10 -0
- data/lib/color_conversion/color_converter.rb +124 -0
- data/lib/color_conversion/converters/cmyk_converter.rb +26 -0
- data/lib/color_conversion/converters/hex_converter.rb +26 -0
- data/lib/color_conversion/converters/hsl_converter.rb +51 -0
- data/lib/color_conversion/converters/hsl_string_converter.rb +24 -0
- data/lib/color_conversion/converters/hsv_converter.rb +35 -0
- data/lib/color_conversion/converters/name_converter.rb +167 -0
- data/lib/color_conversion/converters/null_converter.rb +14 -0
- data/lib/color_conversion/converters/rgb_converter.rb +21 -0
- data/lib/color_conversion/converters/rgb_string_converter.rb +25 -0
- data/lib/color_conversion/errors.rb +4 -0
- data/lib/color_conversion/version.rb +3 -0
- data/spec/color_converter_spec.rb +63 -0
- data/spec/color_spec.rb +94 -0
- data/spec/converters/cmyk_converter_spec.rb +31 -0
- data/spec/converters/hex_converter_spec.rb +33 -0
- data/spec/converters/hsl_converter_spec.rb +41 -0
- data/spec/converters/hsl_string_converter_spec.rb +31 -0
- data/spec/converters/hsv_converter_spec.rb +36 -0
- data/spec/converters/name_converter_spec.rb +26 -0
- data/spec/converters/null_converter_spec.rb +19 -0
- data/spec/converters/rgb_converter_spec.rb +41 -0
- data/spec/converters/rgb_string_converter_spec.rb +45 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/version_spec.rb +9 -0
- metadata +174 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
module ColorConversion
|
2
|
+
class HslStringConverter < ColorConverter
|
3
|
+
|
4
|
+
def self.matches?(color)
|
5
|
+
return false unless color.kind_of?(String)
|
6
|
+
|
7
|
+
color.include?("hsl(") || color.include?("hsla(")
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def to_rgba(hsl)
|
13
|
+
matches = hsl.match(/hsla?\(([0-9\.,%\s]+)\)/)
|
14
|
+
raise InvalidColorError unless matches
|
15
|
+
|
16
|
+
h, s, l, a = matches[1].split(",").map do |color|
|
17
|
+
color.gsub("%", "").strip
|
18
|
+
end
|
19
|
+
raise InvalidColorError unless h && s && l
|
20
|
+
|
21
|
+
HslConverter.new(h: h, s: s, l: l, a: a).rgba
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ColorConversion
|
2
|
+
class HsvConverter < ColorConverter
|
3
|
+
|
4
|
+
def self.matches?(color)
|
5
|
+
return false unless color.kind_of?(Hash)
|
6
|
+
|
7
|
+
color.include?(:h) && color.include?(:s) &&
|
8
|
+
( color.include?(:v) || color.include?(:b) )
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def to_rgba(hsv)
|
14
|
+
h = hsv[:h] / 60.0
|
15
|
+
s = hsv[:s] / 100.0
|
16
|
+
v = (hsv[:v] || hsv[:b]) / 100.0
|
17
|
+
hi = h.floor % 6.0
|
18
|
+
|
19
|
+
f = h - h.floor
|
20
|
+
p = (255 * v * (1 - s)).round
|
21
|
+
q = (255 * v * (1 - (s * f))).round
|
22
|
+
t = (255 * v * (1 - (s * (1 - f)))).round
|
23
|
+
v = (255 * v).round
|
24
|
+
|
25
|
+
case hi
|
26
|
+
when 0 then {r: v, g: t, b: p, a: 1.0}
|
27
|
+
when 1 then {r: q, g: v, b: p, a: 1.0}
|
28
|
+
when 2 then {r: p, g: v, b: t, a: 1.0}
|
29
|
+
when 3 then {r: p, g: q, b: v, a: 1.0}
|
30
|
+
when 4 then {r: t, g: p, b: v, a: 1.0}
|
31
|
+
when 5 then {r: v, g: p, b: q, a: 1.0}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
module ColorConversion
|
2
|
+
class NameConverter < ColorConverter
|
3
|
+
|
4
|
+
def self.matches?(color)
|
5
|
+
return false unless color.kind_of?(String)
|
6
|
+
|
7
|
+
color_names.include?(color.downcase.to_sym)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def to_rgba(name)
|
13
|
+
rgb = self.class.color_names[name.downcase.to_sym]
|
14
|
+
{r: rgb[0], g: rgb[1], b: rgb[2], a: 1.0}
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.color_names
|
18
|
+
{aliceblue: [240,248,255],
|
19
|
+
antiquewhite: [250,235,215],
|
20
|
+
aqua: [0,255,255],
|
21
|
+
aquamarine: [127,255,212],
|
22
|
+
azure: [240,255,255],
|
23
|
+
beige: [245,245,220],
|
24
|
+
bisque: [255,228,196],
|
25
|
+
black: [0,0,0],
|
26
|
+
blanchedalmond: [255,235,205],
|
27
|
+
blue: [0,0,255],
|
28
|
+
blueviolet: [138,43,226],
|
29
|
+
brown: [165,42,42],
|
30
|
+
burlywood: [222,184,135],
|
31
|
+
cadetblue: [95,158,160],
|
32
|
+
chartreuse: [127,255,0],
|
33
|
+
chocolate: [210,105,30],
|
34
|
+
coral: [255,127,80],
|
35
|
+
cornflowerblue: [100,149,237],
|
36
|
+
cornsilk: [255,248,220],
|
37
|
+
crimson: [220,20,60],
|
38
|
+
cyan: [0,255,255],
|
39
|
+
darkblue: [0,0,139],
|
40
|
+
darkcyan: [0,139,139],
|
41
|
+
darkgoldenrod: [184,134,11],
|
42
|
+
darkgray: [169,169,169],
|
43
|
+
darkgreen: [0,100,0],
|
44
|
+
darkgrey: [169,169,169],
|
45
|
+
darkkhaki: [189,183,107],
|
46
|
+
darkmagenta: [139,0,139],
|
47
|
+
darkolivegreen: [85,107,47],
|
48
|
+
darkorange: [255,140,0],
|
49
|
+
darkorchid: [153,50,204],
|
50
|
+
darkred: [139,0,0],
|
51
|
+
darksalmon: [233,150,122],
|
52
|
+
darkseagreen: [143,188,143],
|
53
|
+
darkslateblue: [72,61,139],
|
54
|
+
darkslategray: [47,79,79],
|
55
|
+
darkslategrey: [47,79,79],
|
56
|
+
darkturquoise: [0,206,209],
|
57
|
+
darkviolet: [148,0,211],
|
58
|
+
deeppink: [255,20,147],
|
59
|
+
deepskyblue: [0,191,255],
|
60
|
+
dimgray: [105,105,105],
|
61
|
+
dimgrey: [105,105,105],
|
62
|
+
dodgerblue: [30,144,255],
|
63
|
+
firebrick: [178,34,34],
|
64
|
+
floralwhite: [255,250,240],
|
65
|
+
forestgreen: [34,139,34],
|
66
|
+
fuchsia: [255,0,255],
|
67
|
+
gainsboro: [220,220,220],
|
68
|
+
ghostwhite: [248,248,255],
|
69
|
+
gold: [255,215,0],
|
70
|
+
goldenrod: [218,165,32],
|
71
|
+
gray: [128,128,128],
|
72
|
+
green: [0,128,0],
|
73
|
+
greenyellow: [173,255,47],
|
74
|
+
grey: [128,128,128],
|
75
|
+
honeydew: [240,255,240],
|
76
|
+
hotpink: [255,105,180],
|
77
|
+
indianred: [205,92,92],
|
78
|
+
indigo: [75,0,130],
|
79
|
+
ivory: [255,255,240],
|
80
|
+
khaki: [240,230,140],
|
81
|
+
lavender: [230,230,250],
|
82
|
+
lavenderblush: [255,240,245],
|
83
|
+
lawngreen: [124,252,0],
|
84
|
+
lemonchiffon: [255,250,205],
|
85
|
+
lightblue: [173,216,230],
|
86
|
+
lightcoral: [240,128,128],
|
87
|
+
lightcyan: [224,255,255],
|
88
|
+
lightgoldenrodyellow: [250,250,210],
|
89
|
+
lightgray: [211,211,211],
|
90
|
+
lightgreen: [144,238,144],
|
91
|
+
lightgrey: [211,211,211],
|
92
|
+
lightpink: [255,182,193],
|
93
|
+
lightsalmon: [255,160,122],
|
94
|
+
lightseagreen: [32,178,170],
|
95
|
+
lightskyblue: [135,206,250],
|
96
|
+
lightslategray: [119,136,153],
|
97
|
+
lightslategrey: [119,136,153],
|
98
|
+
lightsteelblue: [176,196,222],
|
99
|
+
lightyellow: [255,255,224],
|
100
|
+
lime: [0,255,0],
|
101
|
+
limegreen: [50,205,50],
|
102
|
+
linen: [250,240,230],
|
103
|
+
magenta: [255,0,255],
|
104
|
+
maroon: [128,0,0],
|
105
|
+
mediumaquamarine: [102,205,170],
|
106
|
+
mediumblue: [0,0,205],
|
107
|
+
mediumorchid: [186,85,211],
|
108
|
+
mediumpurple: [147,112,219],
|
109
|
+
mediumseagreen: [60,179,113],
|
110
|
+
mediumslateblue: [123,104,238],
|
111
|
+
mediumspringgreen: [0,250,154],
|
112
|
+
mediumturquoise: [72,209,204],
|
113
|
+
mediumvioletred: [199,21,133],
|
114
|
+
midnightblue: [25,25,112],
|
115
|
+
mintcream: [245,255,250],
|
116
|
+
mistyrose: [255,228,225],
|
117
|
+
moccasin: [255,228,181],
|
118
|
+
navajowhite: [255,222,173],
|
119
|
+
navy: [0,0,128],
|
120
|
+
oldlace: [253,245,230],
|
121
|
+
olive: [128,128,0],
|
122
|
+
olivedrab: [107,142,35],
|
123
|
+
orange: [255,165,0],
|
124
|
+
orangered: [255,69,0],
|
125
|
+
orchid: [218,112,214],
|
126
|
+
palegoldenrod: [238,232,170],
|
127
|
+
palegreen: [152,251,152],
|
128
|
+
paleturquoise: [175,238,238],
|
129
|
+
palevioletred: [219,112,147],
|
130
|
+
papayawhip: [255,239,213],
|
131
|
+
peachpuff: [255,218,185],
|
132
|
+
peru: [205,133,63],
|
133
|
+
pink: [255,192,203],
|
134
|
+
plum: [221,160,221],
|
135
|
+
powderblue: [176,224,230],
|
136
|
+
purple: [128,0,128],
|
137
|
+
red: [255,0,0],
|
138
|
+
rosybrown: [188,143,143],
|
139
|
+
royalblue: [65,105,225],
|
140
|
+
saddlebrown: [139,69,19],
|
141
|
+
salmon: [250,128,114],
|
142
|
+
sandybrown: [244,164,96],
|
143
|
+
seagreen: [46,139,87],
|
144
|
+
seashell: [255,245,238],
|
145
|
+
sienna: [160,82,45],
|
146
|
+
silver: [192,192,192],
|
147
|
+
skyblue: [135,206,235],
|
148
|
+
slateblue: [106,90,205],
|
149
|
+
slategray: [112,128,144],
|
150
|
+
slategrey: [112,128,144],
|
151
|
+
snow: [255,250,250],
|
152
|
+
springgreen: [0,255,127],
|
153
|
+
steelblue: [70,130,180],
|
154
|
+
tan: [210,180,140],
|
155
|
+
teal: [0,128,128],
|
156
|
+
thistle: [216,191,216],
|
157
|
+
tomato: [255,99,71],
|
158
|
+
turquoise: [64,224,208],
|
159
|
+
violet: [238,130,238],
|
160
|
+
wheat: [245,222,179],
|
161
|
+
white: [255,255,255],
|
162
|
+
whitesmoke: [245,245,245],
|
163
|
+
yellow: [255,255,0],
|
164
|
+
yellowgreen: [154,205,50]}
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ColorConversion
|
2
|
+
class RgbConverter < ColorConverter
|
3
|
+
|
4
|
+
def self.matches?(color)
|
5
|
+
return false unless color.kind_of?(Hash)
|
6
|
+
|
7
|
+
color.include?(:r) && color.include?(:g) && color.include?(:b)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def to_rgba(rgb)
|
13
|
+
r = rgb[:r].to_f
|
14
|
+
g = rgb[:g].to_f
|
15
|
+
b = rgb[:b].to_f
|
16
|
+
a = (rgb[:a] || 1.0).to_f
|
17
|
+
|
18
|
+
{r: r, g: g, b: b, a: a}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module ColorConversion
|
2
|
+
class RgbStringConverter < ColorConverter
|
3
|
+
|
4
|
+
def self.matches?(color)
|
5
|
+
return false unless color.kind_of?(String)
|
6
|
+
|
7
|
+
color.include?("rgb(") || color.include?("rgba(")
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def to_rgba(rgb)
|
13
|
+
matches = rgb.match(/rgba?\(([0-9\.,\s]+)\)/)
|
14
|
+
raise InvalidColorError unless matches
|
15
|
+
|
16
|
+
r, g, b, a = matches[1].split(",").map {|color| color.strip }
|
17
|
+
raise InvalidColorError unless r && g && b
|
18
|
+
|
19
|
+
{r: r.to_i,
|
20
|
+
g: g.to_i,
|
21
|
+
b: b.to_i,
|
22
|
+
a: (a || 1.0).to_f}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ColorConverter do
|
4
|
+
|
5
|
+
describe ".rgb" do
|
6
|
+
it "converts color to rgb" do
|
7
|
+
conv = RgbConverter.new(r: 51, g: 102, b: 204)
|
8
|
+
|
9
|
+
rgb = {r: 51, g: 102, b: 204}
|
10
|
+
expect(conv.rgb).to eq rgb
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ".hex" do
|
15
|
+
it "converts color to hex" do
|
16
|
+
conv = RgbConverter.new(r: 51, g: 102, b: 204)
|
17
|
+
expect(conv.hex).to eq "#3366cc"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe ".hsl" do
|
22
|
+
it "converts color to hsl" do
|
23
|
+
conv = RgbConverter.new(r: 51, g: 102, b: 204)
|
24
|
+
|
25
|
+
hsl = {h: 220, s: 60, l: 50}
|
26
|
+
expect(conv.hsl).to eq hsl
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe ".hsv" do
|
31
|
+
it "converts color to hsv" do
|
32
|
+
conv = RgbConverter.new(r: 51, g: 102, b: 204)
|
33
|
+
|
34
|
+
hsv = {h: 220, s: 75, v: 80}
|
35
|
+
expect(conv.hsv).to eq hsv
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe ".hsb" do
|
40
|
+
it "converts color to hsb" do
|
41
|
+
conv = RgbConverter.new(r: 51, g: 102, b: 204)
|
42
|
+
|
43
|
+
hsb = {h: 220, s: 75, b: 80}
|
44
|
+
expect(conv.hsb).to eq hsb
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe ".cymk" do
|
49
|
+
it "converts color to cymk" do
|
50
|
+
conv = RgbConverter.new(r: 64, g: 104, b: 193)
|
51
|
+
|
52
|
+
cmyk = {c: 67, m: 46, y: 0, k: 24}
|
53
|
+
expect(conv.cmyk).to eq cmyk
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe ".alpha" do
|
58
|
+
it "finds alpha for color" do
|
59
|
+
conv = RgbConverter.new(r: 51, g: 102, b: 204, a: 0.5)
|
60
|
+
expect(conv.alpha).to eq 0.5
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/spec/color_spec.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Color do
|
4
|
+
|
5
|
+
describe ".new with color string" do
|
6
|
+
|
7
|
+
it "should initialize color by lower hex" do
|
8
|
+
color = Color.new("#3366cc")
|
9
|
+
expect(color.rgb).to eq(r: 51, g: 102, b: 204)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should initialize color by hex with hash" do
|
13
|
+
color = Color.new("#3366CC")
|
14
|
+
expect(color.rgb).to eq(r: 51, g: 102, b: 204)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should initialize color by short hex" do
|
18
|
+
color = Color.new("#36C")
|
19
|
+
expect(color.rgb).to eq(r: 51, g: 102, b: 204)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should initialize color by rgb string" do
|
23
|
+
color = Color.new("rgb(51, 102, 204)")
|
24
|
+
expect(color.rgb).to eq(r: 51, g: 102, b: 204)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should initialize color by rgba string" do
|
28
|
+
color = Color.new("rgba(51, 102, 204, 0.2)")
|
29
|
+
expect(color.rgb).to eq(r: 51, g: 102, b: 204)
|
30
|
+
expect(color.alpha).to eq 0.2
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should initialize color by hsl string" do
|
34
|
+
color = Color.new("hsl(225, 73%, 57%)")
|
35
|
+
expect(color.rgb).to eq(r: 65, g: 105, b: 225)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should initialize color by hsla string" do
|
39
|
+
color = Color.new("hsla(225, 73%, 57%, 0.5)")
|
40
|
+
expect(color.rgb).to eq(r: 65, g: 105, b: 225)
|
41
|
+
expect(color.alpha).to eq 0.5
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should initialize color by textual string" do
|
45
|
+
color = Color.new("royalblue")
|
46
|
+
expect(color.rgb).to eq(r: 65, g: 105, b: 225)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should initialize color by textual string case" do
|
50
|
+
color = Color.new("RoyalBlue")
|
51
|
+
expect(color.rgb).to eq(r: 65, g: 105, b: 225)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
describe ".new" do
|
57
|
+
it "should initialize color by rgb" do
|
58
|
+
color = Color.new(r: 51, g: 102, b: 204)
|
59
|
+
expect(color.rgb).to eq(r: 51, g: 102, b: 204)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should initialize color by rgba" do
|
63
|
+
color = Color.new(r: 51, g: 102, b: 204, a: 0.5)
|
64
|
+
expect(color.rgb).to eq(r: 51, g: 102, b: 204)
|
65
|
+
expect(color.alpha).to eq 0.5
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should initialize color by hsl" do
|
69
|
+
color = Color.new(h: 225, s: 73, l: 57)
|
70
|
+
expect(color.rgb).to eq(r: 65, g: 105, b: 225)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should initialize color by hsla" do
|
74
|
+
color = Color.new(h: 225, s: 73, l: 57, a: 0.5)
|
75
|
+
expect(color.rgb).to eq(r: 65, g: 105, b: 225)
|
76
|
+
expect(color.alpha).to eq 0.5
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should initialize color by hsv" do
|
80
|
+
color = Color.new(h: 220, s: 75, v: 80)
|
81
|
+
expect(color.rgb).to eq(r: 51, g: 102, b: 204)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should initialize color by hsb" do
|
85
|
+
color = Color.new(h: 220, s: 75, b: 80)
|
86
|
+
expect(color.rgb).to eq(r: 51, g: 102, b: 204)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should initialize color by cmyk" do
|
90
|
+
color = Color.new(c: 74, m: 58, y: 22, k: 3)
|
91
|
+
expect(color.rgb).to eq(r: 64, g: 104, b: 193)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|