diff --git a/core/color.js b/core/color.js index 71f74bf..fe56fd7 100644 --- a/core/color.js +++ b/core/color.js @@ -1,8 +1,43 @@ var colors = { - maroon: '#800000', red: '#ff0000', orange: '#ffA500', yellow: '#ffff00', olive: '#808000', - purple: '#800080', fuchsia: "#ff00ff", white: '#ffffff', lime: '#00ff00', green: '#008000', - navy: '#000080', blue: '#0000ff', aqua: '#00ffff', teal: '#008080', - black: '#000000', silver: '#c0c0c0', gray: '#808080' + 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', darkgrey: '#a9a9a9', darkgreen: '#006400', 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', + grey: '#808080', green: '#008000', greenyellow: '#adff2f', 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', lightgrey: '#d3d3d3', + lightgreen: '#90ee90', 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', + rebeccapurple: '#663399', 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: "#9acd3" }; var map = function(array, fn){ @@ -13,16 +48,16 @@ var map = function(array, fn){ }; var Color = function(color, type){ - + if (color.isColor){ - + this.red = color.red; this.green = color.green; this.blue = color.blue; this.alpha = color.alpha; } else { - + var namedColor = colors[color]; if (namedColor){ color = namedColor; @@ -41,7 +76,7 @@ var Color = function(color, type){ this.blue = color[2]; this.alpha = color[3]; } - + this.isColor = true; }; @@ -52,34 +87,45 @@ var limit = function(number, min, max){ var listMatch = /([-.\d]+\%?)\s*,\s*([-.\d]+\%?)\s*,\s*([-.\d]+\%?)\s*,?\s*([-.\d]*\%?)/; var hexMatch = /^#?([a-f0-9]{1,2})([a-f0-9]{1,2})([a-f0-9]{1,2})([a-f0-9]{0,2})$/i; +var defaultColorArray = ["00", "00", "00", ""]; // black +var transparentArray = ["00", "00", "00", "00"]; Color.parseRGB = function(color){ - return map(color.match(listMatch).slice(1), function(bit, i){ + // if a color is not matched, fall back to black + var colorArray = color.match(listMatch) ? color.match(listMatch).slice(1) : defaultColorArray; + return map(colorArray, function(bit, i){ if (bit) bit = parseFloat(bit) * (bit[bit.length - 1] == '%' ? 2.55 : 1); return (i < 3) ? Math.round(((bit %= 256) < 0) ? bit + 256 : bit) : limit(((bit === '') ? 1 : Number(bit)), 0, 1); }); }; - + Color.parseHEX = function(color){ if (color.length == 1) color = color + color + color; - return map(color.match(hexMatch).slice(1), function(bit, i){ + var colorArray + // handle transparent and none + if (color === 'transparent' || color === 'none') colorArray = transparentArray; + // if a color is not matched, fall back to black + else colorArray = color.match(hexMatch) ? color.match(hexMatch).slice(1) : defaultColorArray; + return map(colorArray, function(bit, i){ if (i == 3) return (bit) ? parseInt(bit, 16) / 255 : 1; return parseInt((bit.length == 1) ? bit + bit : bit, 16); }); }; - + Color.parseHSB = function(color){ - var hsb = map(color.match(listMatch).slice(1), function(bit, i){ + // if a color is not matched, fall back to black + var colorArray = color.match(listMatch) ? color.match(listMatch).slice(1) : defaultColorArray; + var hsb = map(colorArray, function(bit, i){ if (bit) bit = parseFloat(bit); if (i === 0) return Math.round(((bit %= 360) < 0) ? (bit + 360) : bit); else if (i < 3) return limit(Math.round(bit), 0, 100); else return limit(((bit === '') ? 1 : Number(bit)), 0, 1); }); - + var a = hsb[3]; var br = Math.round(hsb[2] / 100 * 255); if (hsb[1] == 0) return [br, br, br, a]; - + var hue = hsb[0]; var f = hue % 60; var p = Math.round((hsb[2] * (100 - hsb[1])) / 10000 * 255); @@ -97,7 +143,9 @@ Color.parseHSB = function(color){ }; Color.parseHSL = function(color){ - var hsb = map(color.match(listMatch).slice(1), function(bit, i){ + // if a color is not matched, fall back to black + var colorArray = color.match(listMatch) ? color.match(listMatch).slice(1) : defaultColorArray; + var hsb = map(colorArray, function(bit, i){ if (bit) bit = parseFloat(bit); if (i === 0) return Math.round(((bit %= 360) < 0) ? (bit + 360) : bit); else if (i < 3) return limit(Math.round(bit), 0, 100); @@ -108,11 +156,11 @@ Color.parseHSL = function(color){ var s = hsb[1] / 100; var l = hsb[2] / 100; var a = hsb[3]; - + var c = (1 - Math.abs(2 * l - 1)) * s; var x = c * (1 - Math.abs(h % 2 - 1)); var m = l - c / 2; - + var p = Math.round((c + m) * 255); var q = Math.round((x + m) * 255); var t = Math.round((m) * 255); @@ -171,15 +219,15 @@ Color.prototype = { var a = this.alpha; var alpha = ((a = Math.round((a * 255)).toString(16)).length == 1) ? a + a : a; - + var hex = map([this.red, this.green, this.blue], function(bit){ bit = bit.toString(16); return (bit.length == 1) ? '0' + bit : bit; }); - + return (array) ? hex.concat(alpha) : '#' + hex.join('') + ((alpha == 'ff') ? '' : alpha); }, - + toRGB: function(array){ var rgb = [this.red, this.green, this.blue, this.alpha]; return (array) ? rgb : toString('rgb', rgb); @@ -218,4 +266,4 @@ Color.detach = function(color){ return [Color.rgb(color.red, color.green, color.blue).toString(), color.alpha]; }; -module.exports = Color; \ No newline at end of file +module.exports = Color; diff --git a/parsers/svg/colors.js b/parsers/svg/colors.js index 6fe8142..f06c0f2 100644 --- a/parsers/svg/colors.js +++ b/parsers/svg/colors.js @@ -1,158 +1,8 @@ var SVGParser = require('./core'); -var parseColor = SVGParser.prototype.parseColor, - namedColors = { - // Colors already in the Color class are commented out - 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' - }; +var parseColor = SVGParser.prototype.parseColor; SVGParser.prototype.parseColor = function(value, opacity, styles){ if (value == 'currentColor') value = styles.color; - return parseColor.call(this, namedColors[value] || value, opacity, styles); -}; \ No newline at end of file + return parseColor.call(this, value, opacity, styles); +};