| | |
| | | /* MIT license */ |
| | | var colorNames = require('color-name'); |
| | | var swizzle = require('simple-swizzle'); |
| | | var hasOwnProperty = Object.hasOwnProperty; |
| | | |
| | | var reverseNames = {}; |
| | | var reverseNames = Object.create(null); |
| | | |
| | | // create a list of reverse color names |
| | | for (var name in colorNames) { |
| | | if (colorNames.hasOwnProperty(name)) { |
| | | if (hasOwnProperty.call(colorNames, name)) { |
| | | reverseNames[colorNames[name]] = name; |
| | | } |
| | | } |
| | |
| | | |
| | | var abbr = /^#([a-f0-9]{3,4})$/i; |
| | | var hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i; |
| | | var rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/; |
| | | var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/; |
| | | var keyword = /(\D+)/; |
| | | var rgba = /^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/; |
| | | var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/; |
| | | var keyword = /^(\w+)$/; |
| | | |
| | | var rgb = [0, 0, 0, 1]; |
| | | var match; |
| | |
| | | } |
| | | |
| | | if (match[4]) { |
| | | rgb[3] = parseFloat(match[4]); |
| | | if (match[5]) { |
| | | rgb[3] = parseFloat(match[4]) * 0.01; |
| | | } else { |
| | | rgb[3] = parseFloat(match[4]); |
| | | } |
| | | } |
| | | } else if (match = string.match(per)) { |
| | | for (i = 0; i < 3; i++) { |
| | |
| | | } |
| | | |
| | | if (match[4]) { |
| | | rgb[3] = parseFloat(match[4]); |
| | | if (match[5]) { |
| | | rgb[3] = parseFloat(match[4]) * 0.01; |
| | | } else { |
| | | rgb[3] = parseFloat(match[4]); |
| | | } |
| | | } |
| | | } else if (match = string.match(keyword)) { |
| | | if (match[1] === 'transparent') { |
| | | return [0, 0, 0, 0]; |
| | | } |
| | | |
| | | rgb = colorNames[match[1]]; |
| | | |
| | | if (!rgb) { |
| | | if (!hasOwnProperty.call(colorNames, match[1])) { |
| | | return null; |
| | | } |
| | | |
| | | rgb = colorNames[match[1]]; |
| | | rgb[3] = 1; |
| | | |
| | | return rgb; |
| | |
| | | return null; |
| | | } |
| | | |
| | | var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?[\d\.]+)\s*)?\)$/; |
| | | var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/; |
| | | var match = string.match(hsl); |
| | | |
| | | if (match) { |
| | | var alpha = parseFloat(match[4]); |
| | | var h = (parseFloat(match[1]) + 360) % 360; |
| | | var h = ((parseFloat(match[1]) % 360) + 360) % 360; |
| | | var s = clamp(parseFloat(match[2]), 0, 100); |
| | | var l = clamp(parseFloat(match[3]), 0, 100); |
| | | var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1); |
| | |
| | | return null; |
| | | } |
| | | |
| | | var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/; |
| | | var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/; |
| | | var match = string.match(hwb); |
| | | |
| | | if (match) { |
| | |
| | | } |
| | | |
| | | function hexDouble(num) { |
| | | var str = num.toString(16).toUpperCase(); |
| | | var str = Math.round(num).toString(16).toUpperCase(); |
| | | return (str.length < 2) ? '0' + str : str; |
| | | } |