Skip to content

Instantly share code, notes, and snippets.

Created December 13, 2012 00:20
Show Gist options
  • Save anonymous/4272953 to your computer and use it in GitHub Desktop.
Save anonymous/4272953 to your computer and use it in GitHub Desktop.
CoffeeScript Color parser
PopKit.Color = SC.Object.extend SC.Copyable,
rgb: (->
PopKit.Color.hsbToRgb(@get("hsb"))
).property("hsb")
copy: -> PopKit.Color.create(hsb: @get("hsb"))
PopKit.Color.reopenClass
hsbToRgb: (hsb) ->
[h, s, b] = hsb
br = Math.round(b / 100 * 255)
if s == 0
[br, br, br]
else
hue = h % 360
f = hue % 60
p = Math.round((hsb[2] * (100 - s)) / 10000 * 255)
q = Math.round((hsb[2] * (6000 - s * f)) / 600000 * 255)
t = Math.round((hsb[2] * (6000 - s * (60 - f))) / 600000 * 255)
switch Math.floor(hue / 60)
when 0 then [br, t, p]
when 1 then [q, br, p]
when 2 then [p, br, t]
when 3 then [p, q, br]
when 4 then [t, p, br]
when 5 then [br, p, q]
else false
rgbToHsb: (rgb) ->
[red, green, blue] = rgb
hue = 0
max = Math.max(red, green, blue)
min = Math.min(red, green, blue)
delta = max - min
brightness = max / 255
saturation = if (max != 0) then (delta / max) else 0
if saturation != 0
rr = (max - red) / delta
gr = (max - green) / delta
br = (max - blue) / delta
if (red == max)
hue = br - gr
else if (green == max)
hue = 2 + rr - br
else
hue = 4 + gr - rr
hue /= 6
if (hue < 0)
hue++
[
Math.round(hue * 360)
Math.round(saturation * 100)
Math.round(brightness * 100)
]
hexToRgba: (hexString) ->
hex = hexString.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})(\w{1,2})?$/)
hex[4] ||= "ff"
parts = for part in hex.slice(1)
part += part if part.length == 1
parseInt(part, 16)
nameMap:
aliceblue: "#F0F8FF"
antiquewhite: "#FAEBD7"
aqua: "#00FFFF"
aquamarine: "#7FFFD4"
azure: "#F0FFFF"
beige: "#F5F5DC"
bisque: "#FFE4C4"
black: "#000000"
blanchedalmond: "#FFEBCD"
blue: "#0000FF"
blueviolet: "#8A2BE2"
brown: "#A52A2A"
burlywood: "#DEB887"
cadetblue: "#5F9EA0"
chartreuse: "#7FFF00"
chocolate: "#D2691E"
coral: "#FF7F50"
cornflowerblue: "#6495ED"
cornsilk: "#FFF8DC"
crimson: "#DC143C"
cyan: "#00FFFF"
darkblue: "#00008B"
darkcyan: "#008B8B"
darkgoldenrod: "#B8860B"
darkgray: "#A9A9A9"
darkgreen: "#006400"
darkgrey: "#A9A9A9"
darkkhaki: "#BDB76B"
darkmagenta: "#8B008B"
darkolivegreen: "#556B2F"
darkorange: "#FF8C00"
darkorchid: "#9932CC"
darkred: "#8B0000"
darksalmon: "#E9967A"
darkseagreen: "#8FBC8F"
darkslateblue: "#483D8B"
darkslategray: "#2F4F4F"
darkslategrey: "#2F4F4F"
darkturquoise: "#00CED1"
darkviolet: "#9400D3"
deeppink: "#FF1493"
deepskyblue: "#00BFFF"
dimgray: "#696969"
dimgrey: "#696969"
dodgerblue: "#1E90FF"
firebrick: "#B22222"
floralwhite: "#FFFAF0"
forestgreen: "#228B22"
fuchsia: "#FF00FF"
gainsboro: "#DCDCDC"
ghostwhite: "#F8F8FF"
gold: "#FFD700"
goldenrod: "#DAA520"
gray: "#808080"
green: "#008000"
greenyellow: "#ADFF2F"
grey: "#808080"
honeydew: "#F0FFF0"
hotpink: "#FF69B4"
indianred: "#CD5C5C"
indigo: "#4B0082"
ivory: "#FFFFF0"
khaki: "#F0E68C"
lavender: "#E6E6FA"
lavenderblush: "#FFF0F5"
lawngreen: "#7CFC00"
lemonchiffon: "#FFFACD"
lightblue: "#ADD8E6"
lightcoral: "#F08080"
lightcyan: "#E0FFFF"
lightgoldenrodyellow: "#FAFAD2"
lightgray: "#D3D3D3"
lightgreen: "#90EE90"
lightgrey: "#D3D3D3"
lightpink: "#FFB6C1"
lightsalmon: "#FFA07A"
lightseagreen: "#20B2AA"
lightskyblue: "#87CEFA"
lightslategray: "#778899"
lightslategrey: "#778899"
lightsteelblue: "#B0C4DE"
lightyellow: "#FFFFE0"
lime: "#00FF00"
limegreen: "#32CD32"
linen: "#FAF0E6"
magenta: "#FF00FF"
maroon: "#800000"
mediumaquamarine: "#66CDAA"
mediumblue: "#0000CD"
mediumorchid: "#BA55D3"
mediumpurple: "#9370DB"
mediumseagreen: "#3CB371"
mediumslateblue: "#7B68EE"
mediumspringgreen: "#00FA9A"
mediumturquoise: "#48D1CC"
mediumvioletred: "#C71585"
midnightblue: "#191970"
mintcream: "#F5FFFA"
mistyrose: "#FFE4E1"
moccasin: "#FFE4B5"
navajowhite: "#FFDEAD"
navy: "#000080"
oldlace: "#FDF5E6"
olive: "#808000"
olivedrab: "#6B8E23"
orange: "#FFA500"
orangered: "#FF4500"
orchid: "#DA70D6"
palegoldenrod: "#EEE8AA"
palegreen: "#98FB98"
paleturquoise: "#AFEEEE"
palevioletred: "#DB7093"
papayawhip: "#FFEFD5"
peachpuff: "#FFDAB9"
peru: "#CD853F"
pink: "#FFC0CB"
plum: "#DDA0DD"
powderblue: "#B0E0E6"
purple: "#800080"
red: "#FF0000"
rosybrown: "#BC8F8F"
royalblue: "#4169E1"
saddlebrown: "#8B4513"
salmon: "#FA8072"
sandybrown: "#F4A460"
seagreen: "#2E8B57"
seashell: "#FFF5EE"
sienna: "#A0522D"
silver: "#C0C0C0"
skyblue: "#87CEEB"
slateblue: "#6A5ACD"
slategray: "#708090"
slategrey: "#708090"
snow: "#FFFAFA"
springgreen: "#00FF7F"
steelblue: "#4682B4"
tan: "#D2B48C"
teal: "#008080"
thistle: "#D8BFD8"
tomato: "#FF6347"
turquoise: "#40E0D0"
violet: "#EE82EE"
wheat: "#F5DEB3"
white: "#FFFFFF"
whitesmoke: "#F5F5F5"
yellow: "#FFFF00"
yellowgreen: "#9ACD32"
nameToRgba: (name) ->
@hexToRgba(@nameMap[name])
rgbToHex: (args...) ->
args[3] = Math.ceil(args[3] * 255) if args[3]
hex = for arg in args
bit = (arg - 0).toString(16)
if (bit.length == 1)
"0#{bit}"
else
bit
"##{hex.join('')}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment