/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule normalizeColor * @flow */ /* eslint no-bitwise: 0 */ 'use strict'; function normalizeColor(color: string): ?number { var match; // Ordered based on occurrences on Facebook codebase if ((match = matchers.hex6.exec(color))) { return 0xff000000 + parseInt(match[1], 16); } if (names.hasOwnProperty(color)) { return names[color]; } if ((match = matchers.rgb.exec(color))) { return ( 0xff000000 + // a parse255(match[1]) * (1 << 16) + // r parse255(match[2]) * (1 << 8) + // g parse255(match[3]) // b ); } if ((match = matchers.rgba.exec(color))) { return ( parse1(match[4]) * (1 << 24) + // a parse255(match[1]) * (1 << 16) + // r parse255(match[2]) * (1 << 8) + // g parse255(match[3]) // b ); } if ((match = matchers.hex3.exec(color))) { return ( parseInt( 'ff' + // a match[1] + match[1] + // r match[2] + match[2] + // g match[3] + match[3], // b 16 ) ); } // https://drafts.csswg.org/css-color-4/#hex-notation if ((match = matchers.hex8.exec(color))) { var number = parseInt(match[1], 16); // Convert 0xrrggbbaa into 0xaarrggbb return (number << 24 | number >>> 8) >>> 0; } if ((match = matchers.hex4.exec(color))) { return ( parseInt( match[4] + match[4] + // a match[1] + match[1] + // r match[2] + match[2] + // g match[3] + match[3], // b 16 ) ); } if ((match = matchers.hsl.exec(color))) { return ( 0xff000000 + // a hslToRgb( parse360(match[1]), // h parsePercentage(match[2]), // s parsePercentage(match[3]) // l ) ); } if ((match = matchers.hsla.exec(color))) { return ( parse1(match[4]) * (1 << 24) + // a hslToRgb( parse360(match[1]), // h parsePercentage(match[2]), // s parsePercentage(match[3]) // l ) ); } return null; } function hue2rgb(p: number, q: number, t: number): number { if (t < 0) { t += 1; } if (t > 1) { t -= 1; } if (t < 1 / 6) { return p + (q - p) * 6 * t; } if (t < 1 / 2) { return q; } if (t < 2 / 3) { return p + (q - p) * (2 / 3 - t) * 6; } return p; } function hslToRgb(h: number, s: number, l: number): number { var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; var r = hue2rgb(p, q, h + 1 / 3); var g = hue2rgb(p, q, h); var b = hue2rgb(p, q, h - 1 / 3); return ( Math.round(r * 255) * (1 << 16) + Math.round(g * 255) * (1 << 8) + Math.round(b * 255) ); } // var INTEGER = '[-+]?\\d+'; var NUMBER = '[-+]?\\d*\\.?\\d+'; var PERCENTAGE = NUMBER + '%'; function call(...args) { return '\\(\\s*(' + args.join(')\\s*,\\s*(') + ')\\s*\\)'; } var matchers = { rgb: new RegExp('rgb' + call(NUMBER, NUMBER, NUMBER)), rgba: new RegExp('rgba' + call(NUMBER, NUMBER, NUMBER, NUMBER)), hsl: new RegExp('hsl' + call(NUMBER, PERCENTAGE, PERCENTAGE)), hsla: new RegExp('hsla' + call(NUMBER, PERCENTAGE, PERCENTAGE, NUMBER)), hex3: /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex4: /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex6: /^#([0-9a-fA-F]{6})$/, hex8: /^#([0-9a-fA-F]{8})$/, }; function parse255(str: string): number { var int = parseInt(str, 10); if (int < 0) { return 0; } if (int > 255) { return 255; } return int; } function parse360(str: string): number { var int = parseFloat(str); return (((int % 360) + 360) % 360) / 360; } function parse1(str: string): number { var num = parseFloat(str); if (num < 0) { return 0; } if (num > 1) { return 255; } return Math.round(num * 255); } function parsePercentage(str: string): number { // parseFloat conveniently ignores the final % var int = parseFloat(str, 10); if (int < 0) { return 0; } if (int > 100) { return 1; } return int / 100; } var names = { transparent: 0x00000000, // http://www.w3.org/TR/css3-color/#svg-color aliceblue: 0xfff0f8ff, antiquewhite: 0xfffaebd7, aqua: 0xff00ffff, aquamarine: 0xff7fffd4, azure: 0xfff0ffff, beige: 0xfff5f5dc, bisque: 0xffffe4c4, black: 0xff000000, blanchedalmond: 0xffffebcd, blue: 0xff0000ff, blueviolet: 0xff8a2be2, brown: 0xffa52a2a, burlywood: 0xffdeb887, burntsienna: 0xffea7e5d, cadetblue: 0xff5f9ea0, chartreuse: 0xff7fff00, chocolate: 0xffd2691e, coral: 0xffff7f50, cornflowerblue: 0xff6495ed, cornsilk: 0xfffff8dc, crimson: 0xffdc143c, cyan: 0xff00ffff, darkblue: 0xff00008b, darkcyan: 0xff008b8b, darkgoldenrod: 0xffb8860b, darkgray: 0xffa9a9a9, darkgreen: 0xff006400, darkgrey: 0xffa9a9a9, darkkhaki: 0xffbdb76b, darkmagenta: 0xff8b008b, darkolivegreen: 0xff556b2f, darkorange: 0xffff8c00, darkorchid: 0xff9932cc, darkred: 0xff8b0000, darksalmon: 0xffe9967a, darkseagreen: 0xff8fbc8f, darkslateblue: 0xff483d8b, darkslategray: 0xff2f4f4f, darkslategrey: 0xff2f4f4f, darkturquoise: 0xff00ced1, darkviolet: 0xff9400d3, deeppink: 0xffff1493, deepskyblue: 0xff00bfff, dimgray: 0xff696969, dimgrey: 0xff696969, dodgerblue: 0xff1e90ff, firebrick: 0xffb22222, floralwhite: 0xfffffaf0, forestgreen: 0xff228b22, fuchsia: 0xffff00ff, gainsboro: 0xffdcdcdc, ghostwhite: 0xfff8f8ff, gold: 0xffffd700, goldenrod: 0xffdaa520, gray: 0xff808080, green: 0xff008000, greenyellow: 0xffadff2f, grey: 0xff808080, honeydew: 0xfff0fff0, hotpink: 0xffff69b4, indianred: 0xffcd5c5c, indigo: 0xff4b0082, ivory: 0xfffffff0, khaki: 0xfff0e68c, lavender: 0xffe6e6fa, lavenderblush: 0xfffff0f5, lawngreen: 0xff7cfc00, lemonchiffon: 0xfffffacd, lightblue: 0xffadd8e6, lightcoral: 0xfff08080, lightcyan: 0xffe0ffff, lightgoldenrodyellow: 0xfffafad2, lightgray: 0xffd3d3d3, lightgreen: 0xff90ee90, lightgrey: 0xffd3d3d3, lightpink: 0xffffb6c1, lightsalmon: 0xffffa07a, lightseagreen: 0xff20b2aa, lightskyblue: 0xff87cefa, lightslategray: 0xff778899, lightslategrey: 0xff778899, lightsteelblue: 0xffb0c4de, lightyellow: 0xffffffe0, lime: 0xff00ff00, limegreen: 0xff32cd32, linen: 0xfffaf0e6, magenta: 0xffff00ff, maroon: 0xff800000, mediumaquamarine: 0xff66cdaa, mediumblue: 0xff0000cd, mediumorchid: 0xffba55d3, mediumpurple: 0xff9370db, mediumseagreen: 0xff3cb371, mediumslateblue: 0xff7b68ee, mediumspringgreen: 0xff00fa9a, mediumturquoise: 0xff48d1cc, mediumvioletred: 0xffc71585, midnightblue: 0xff191970, mintcream: 0xfff5fffa, mistyrose: 0xffffe4e1, moccasin: 0xffffe4b5, navajowhite: 0xffffdead, navy: 0xff000080, oldlace: 0xfffdf5e6, olive: 0xff808000, olivedrab: 0xff6b8e23, orange: 0xffffa500, orangered: 0xffff4500, orchid: 0xffda70d6, palegoldenrod: 0xffeee8aa, palegreen: 0xff98fb98, paleturquoise: 0xffafeeee, palevioletred: 0xffdb7093, papayawhip: 0xffffefd5, peachpuff: 0xffffdab9, peru: 0xffcd853f, pink: 0xffffc0cb, plum: 0xffdda0dd, powderblue: 0xffb0e0e6, purple: 0xff800080, rebeccapurple: 0xff663399, red: 0xffff0000, rosybrown: 0xffbc8f8f, royalblue: 0xff4169e1, saddlebrown: 0xff8b4513, salmon: 0xfffa8072, sandybrown: 0xfff4a460, seagreen: 0xff2e8b57, seashell: 0xfffff5ee, sienna: 0xffa0522d, silver: 0xffc0c0c0, skyblue: 0xff87ceeb, slateblue: 0xff6a5acd, slategray: 0xff708090, slategrey: 0xff708090, snow: 0xfffffafa, springgreen: 0xff00ff7f, steelblue: 0xff4682b4, tan: 0xffd2b48c, teal: 0xff008080, thistle: 0xffd8bfd8, tomato: 0xffff6347, turquoise: 0xff40e0d0, violet: 0xffee82ee, wheat: 0xfff5deb3, white: 0xffffffff, whitesmoke: 0xfff5f5f5, yellow: 0xffffff00, yellowgreen: 0xff9acd32, }; module.exports = normalizeColor;