UNPKG

node-swatch-names

Version:

Swatch-names automatically and consistently names Photoshop swatches to be shared among frontend developers and designers. Exports colors to SASS variables and JSON for use in code.

115 lines (90 loc) 11.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.decode = exports.encode = exports.sanitizeColorName = exports.processSwatch = exports.getColorNames = exports.FILE_HEADER = undefined; var _aco = require('./aco'); Object.defineProperty(exports, 'encode', { enumerable: true, get: function get() { return _aco.encode; } }); Object.defineProperty(exports, 'decode', { enumerable: true, get: function get() { return _aco.decode; } }); var _colorNameList = require('color-name-list'); var _colorNameList2 = _interopRequireDefault(_colorNameList); var _nearestColor = require('nearest-color'); var _nearestColor2 = _interopRequireDefault(_nearestColor); var _diacritics = require('diacritics'); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const FILE_HEADER = exports.FILE_HEADER = '// File auto generated by \'swatch-names\'. Do not modify this file directly.\n'; /** * Returns color names and hex values * * @param {string[]|string} hexValues - Array of hex values or one individual hex color: ['#ffffff', '#000000'] or '#ffffff' * @returns {Array} - Array of objects: [{name: 'red', hex: '#ff0000'}, ...] */ const getColorNames = exports.getColorNames = hexValues => { const allColors = []; let allColorNames = _colorNameList2.default.reduce((result, c) => { result[c.name] = c.hex; return result; }, {}); if (!hexValues.length) { throw new Error('Wrong argument: getColorNames() expects an array of hex values or a single hex color string.'); } if (_lodash2.default.isString(hexValues)) { hexValues = [hexValues]; } _lodash2.default.forEach(hexValues, hex => { const validHex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(hex); if (!validHex) { throw new Error('Incorrect hex code supplied: ' + hex); } hex = expand(hex); const nearestColorName = _nearestColor2.default.from(allColorNames); const foundColor = nearestColorName(hex); // Remove from allColorNames allColorNames = _lodash2.default.omit(allColorNames, foundColor.name); allColors.push({ name: sanitizeColorName(foundColor.name), hex }); }); return allColors; }; const expand = hex => { if (hex.length === 4 && hex.charAt(0) === '#') { hex = '#' + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2) + hex.charAt(3) + hex.charAt(3); } return hex.toUpperCase(); }; /** * Processes the supplied swatch file, returns a swatch object, generates SCSS/JS source with color variables. * * @param swatchData - JSON data generated by acoReader * @returns {{colors: Array, scss: string, js: string}} */ const processSwatch = exports.processSwatch = swatchData => { const hexValues = swatchData.map(swatch => swatch.hex); const colors = getColorNames(hexValues); const scss = colors.reduce((result, color) => `${result}$${color.name}: '${color.hex}';\n`, FILE_HEADER); const jsData = colors.reduce((result, color) => `${result}\t${color.name.replace(/-/g, '_')}: '${color.hex}',\n`, ''); const js = `${FILE_HEADER}export default {\n${jsData}};`; return { colors, scss, js }; }; /** * Removes special characters, spaces, diacritics from input string, ensures that the string doesn't start with a number * * @param {string} name - The input color name: "1975 Earth's Red" * @param {string} divider - Divider character that replaces spaces: "-" * @returns {string} - The sanitized name, ready to be used as a variable: "the-1975-earths-red" */ const sanitizeColorName = exports.sanitizeColorName = (name, divider = '-') => { return (0, _diacritics.remove)(name.toLowerCase()).replace(/^(\d{1})(.*)/, 'the-$1$2').replace(/[^\w|\d|\s|-]/g, '').replace(/\s/g, divider); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvc3dhdGNoLW5hbWVzLmpzIl0sIm5hbWVzIjpbImVuY29kZSIsImRlY29kZSIsIkZJTEVfSEVBREVSIiwiZ2V0Q29sb3JOYW1lcyIsImhleFZhbHVlcyIsImFsbENvbG9ycyIsImFsbENvbG9yTmFtZXMiLCJyZWR1Y2UiLCJyZXN1bHQiLCJjIiwibmFtZSIsImhleCIsImxlbmd0aCIsIkVycm9yIiwiaXNTdHJpbmciLCJmb3JFYWNoIiwidmFsaWRIZXgiLCJ0ZXN0IiwiZXhwYW5kIiwibmVhcmVzdENvbG9yTmFtZSIsImZyb20iLCJmb3VuZENvbG9yIiwib21pdCIsInB1c2giLCJzYW5pdGl6ZUNvbG9yTmFtZSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwicHJvY2Vzc1N3YXRjaCIsInN3YXRjaERhdGEiLCJtYXAiLCJzd2F0Y2giLCJjb2xvcnMiLCJzY3NzIiwiY29sb3IiLCJqc0RhdGEiLCJyZXBsYWNlIiwianMiLCJkaXZpZGVyIiwidG9Mb3dlckNhc2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztjQW1GUUEsTTs7Ozs7O2NBQVFDLE07Ozs7QUFuRmhCOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7Ozs7O0FBRU8sTUFBTUMsb0NBQWMsaUZBQXBCOztBQUVQOzs7Ozs7QUFNTyxNQUFNQyx3Q0FBaUJDLFNBQUQsSUFBZTtBQUMzQyxPQUFNQyxZQUFZLEVBQWxCOztBQUVBLEtBQUlDLGdCQUFnQix3QkFBWUMsTUFBWixDQUFtQixDQUFDQyxNQUFELEVBQVNDLENBQVQsS0FBZTtBQUNyREQsU0FBT0MsRUFBRUMsSUFBVCxJQUFpQkQsRUFBRUUsR0FBbkI7QUFDQSxTQUFPSCxNQUFQO0FBQ0EsRUFIbUIsRUFHakIsRUFIaUIsQ0FBcEI7O0FBS0EsS0FBSSxDQUFDSixVQUFVUSxNQUFmLEVBQXVCO0FBQ3RCLFFBQU0sSUFBSUMsS0FBSixDQUFVLDhGQUFWLENBQU47QUFDQTs7QUFFRCxLQUFJLGlCQUFFQyxRQUFGLENBQVdWLFNBQVgsQ0FBSixFQUEyQjtBQUMxQkEsY0FBWSxDQUFDQSxTQUFELENBQVo7QUFDQTs7QUFFRCxrQkFBRVcsT0FBRixDQUFVWCxTQUFWLEVBQXNCTyxHQUFELElBQVM7O0FBRTdCLFFBQU1LLFdBQVcsZ0NBQWdDQyxJQUFoQyxDQUFxQ04sR0FBckMsQ0FBakI7QUFDQSxNQUFJLENBQUNLLFFBQUwsRUFBZTtBQUNkLFNBQU0sSUFBSUgsS0FBSixDQUFVLGtDQUFrQ0YsR0FBNUMsQ0FBTjtBQUNBOztBQUVEQSxRQUFNTyxPQUFPUCxHQUFQLENBQU47O0FBRUEsUUFBTVEsbUJBQW1CLHVCQUFhQyxJQUFiLENBQWtCZCxhQUFsQixDQUF6QjtBQUNBLFFBQU1lLGFBQWFGLGlCQUFpQlIsR0FBakIsQ0FBbkI7O0FBRUE7QUFDQUwsa0JBQWdCLGlCQUFFZ0IsSUFBRixDQUFPaEIsYUFBUCxFQUFzQmUsV0FBV1gsSUFBakMsQ0FBaEI7QUFDQUwsWUFBVWtCLElBQVYsQ0FBZSxFQUFDYixNQUFNYyxrQkFBa0JILFdBQVdYLElBQTdCLENBQVAsRUFBMkNDLEdBQTNDLEVBQWY7QUFDQSxFQWZEOztBQWlCQSxRQUFPTixTQUFQO0FBQ0EsQ0FsQ007O0FBb0NQLE1BQU1hLFNBQVVQLEdBQUQsSUFBUztBQUN2QixLQUFLQSxJQUFJQyxNQUFKLEtBQWUsQ0FBaEIsSUFBdUJELElBQUljLE1BQUosQ0FBVyxDQUFYLE1BQWtCLEdBQTdDLEVBQW1EO0FBQ2xEZCxRQUFNLE1BQU1BLElBQUljLE1BQUosQ0FBVyxDQUFYLENBQU4sR0FBc0JkLElBQUljLE1BQUosQ0FBVyxDQUFYLENBQXRCLEdBQXNDZCxJQUFJYyxNQUFKLENBQVcsQ0FBWCxDQUF0QyxHQUFzRGQsSUFBSWMsTUFBSixDQUFXLENBQVgsQ0FBdEQsR0FBc0VkLElBQUljLE1BQUosQ0FBVyxDQUFYLENBQXRFLEdBQXNGZCxJQUFJYyxNQUFKLENBQVcsQ0FBWCxDQUE1RjtBQUNBO0FBQ0QsUUFBT2QsSUFBSWUsV0FBSixFQUFQO0FBQ0EsQ0FMRDs7QUFRQTs7Ozs7O0FBTU8sTUFBTUMsd0NBQWdCQyxjQUFjO0FBQzFDLE9BQU14QixZQUFZd0IsV0FBV0MsR0FBWCxDQUFlQyxVQUFVQSxPQUFPbkIsR0FBaEMsQ0FBbEI7QUFDQSxPQUFNb0IsU0FBUzVCLGNBQWNDLFNBQWQsQ0FBZjtBQUNBLE9BQU00QixPQUFPRCxPQUFPeEIsTUFBUCxDQUFjLENBQUNDLE1BQUQsRUFBU3lCLEtBQVQsS0FBb0IsR0FBRXpCLE1BQU8sSUFBR3lCLE1BQU12QixJQUFLLE1BQUt1QixNQUFNdEIsR0FBSSxNQUF4RSxFQUErRVQsV0FBL0UsQ0FBYjtBQUNBLE9BQU1nQyxTQUFTSCxPQUFPeEIsTUFBUCxDQUFjLENBQUNDLE1BQUQsRUFBU3lCLEtBQVQsS0FBb0IsR0FBRXpCLE1BQU8sS0FBSXlCLE1BQU12QixJQUFOLENBQVd5QixPQUFYLENBQW1CLElBQW5CLEVBQXlCLEdBQXpCLENBQThCLE1BQUtGLE1BQU10QixHQUFJLE1BQTVGLEVBQW1HLEVBQW5HLENBQWY7QUFDQSxPQUFNeUIsS0FBTSxHQUFFbEMsV0FBWSxxQkFBb0JnQyxNQUFPLElBQXJEO0FBQ0EsUUFBTyxFQUFDSCxNQUFELEVBQVNDLElBQVQsRUFBZUksRUFBZixFQUFQO0FBQ0EsQ0FQTTs7QUFTUDs7Ozs7OztBQU9PLE1BQU1aLGdEQUFvQixDQUFDZCxJQUFELEVBQU8yQixVQUFRLEdBQWYsS0FBdUI7QUFDdkQsUUFBTyx3QkFBaUIzQixLQUFLNEIsV0FBTCxFQUFqQixFQUFxQ0gsT0FBckMsQ0FBNkMsY0FBN0MsRUFBNkQsVUFBN0QsRUFBeUVBLE9BQXpFLENBQWlGLGdCQUFqRixFQUFtRyxFQUFuRyxFQUF1R0EsT0FBdkcsQ0FBK0csS0FBL0csRUFBc0hFLE9BQXRILENBQVA7QUFDQSxDQUZNIiwiZmlsZSI6InN3YXRjaC1uYW1lcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBuYW1lZENvbG9ycyBmcm9tICdjb2xvci1uYW1lLWxpc3QnO1xuaW1wb3J0IG5lYXJlc3RDb2xvciBmcm9tICduZWFyZXN0LWNvbG9yJztcbmltcG9ydCB7cmVtb3ZlIGFzIHJlbW92ZURpYWNyaXRpY3N9IGZyb20gJ2RpYWNyaXRpY3MnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNvbnN0IEZJTEVfSEVBREVSID0gJy8vIEZpbGUgYXV0byBnZW5lcmF0ZWQgYnkgXFwnc3dhdGNoLW5hbWVzXFwnLiBEbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSBkaXJlY3RseS5cXG4nO1xuXG4vKipcbiAqIFJldHVybnMgY29sb3IgbmFtZXMgYW5kIGhleCB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfHN0cmluZ30gaGV4VmFsdWVzIC0gQXJyYXkgb2YgaGV4IHZhbHVlcyBvciBvbmUgaW5kaXZpZHVhbCBoZXggY29sb3I6IFsnI2ZmZmZmZicsICcjMDAwMDAwJ10gb3IgJyNmZmZmZmYnXG4gKiBAcmV0dXJucyB7QXJyYXl9IC0gQXJyYXkgb2Ygb2JqZWN0czogW3tuYW1lOiAncmVkJywgaGV4OiAnI2ZmMDAwMCd9LCAuLi5dXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2xvck5hbWVzID0gKGhleFZhbHVlcykgPT4ge1xuXHRjb25zdCBhbGxDb2xvcnMgPSBbXTtcblxuXHRsZXQgYWxsQ29sb3JOYW1lcyA9IG5hbWVkQ29sb3JzLnJlZHVjZSgocmVzdWx0LCBjKSA9PiB7XG5cdFx0cmVzdWx0W2MubmFtZV0gPSBjLmhleDtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LCB7fSk7XG5cblx0aWYgKCFoZXhWYWx1ZXMubGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdXcm9uZyBhcmd1bWVudDogZ2V0Q29sb3JOYW1lcygpIGV4cGVjdHMgYW4gYXJyYXkgb2YgaGV4IHZhbHVlcyBvciBhIHNpbmdsZSBoZXggY29sb3Igc3RyaW5nLicpO1xuXHR9XG5cblx0aWYgKF8uaXNTdHJpbmcoaGV4VmFsdWVzKSkge1xuXHRcdGhleFZhbHVlcyA9IFtoZXhWYWx1ZXNdO1xuXHR9XG5cblx0Xy5mb3JFYWNoKGhleFZhbHVlcywgKGhleCkgPT4ge1xuXG5cdFx0Y29uc3QgdmFsaWRIZXggPSAvXiMoWzAtOWEtZl17M318WzAtOWEtZl17Nn0pJC9pLnRlc3QoaGV4KTtcblx0XHRpZiAoIXZhbGlkSGV4KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCBoZXggY29kZSBzdXBwbGllZDogJyArIGhleCk7XG5cdFx0fVxuXG5cdFx0aGV4ID0gZXhwYW5kKGhleCk7XG5cblx0XHRjb25zdCBuZWFyZXN0Q29sb3JOYW1lID0gbmVhcmVzdENvbG9yLmZyb20oYWxsQ29sb3JOYW1lcyk7XG5cdFx0Y29uc3QgZm91bmRDb2xvciA9IG5lYXJlc3RDb2xvck5hbWUoaGV4KTtcblxuXHRcdC8vIFJlbW92ZSBmcm9tIGFsbENvbG9yTmFtZXNcblx0XHRhbGxDb2xvck5hbWVzID0gXy5vbWl0KGFsbENvbG9yTmFtZXMsIGZvdW5kQ29sb3IubmFtZSk7XG5cdFx0YWxsQ29sb3JzLnB1c2goe25hbWU6IHNhbml0aXplQ29sb3JOYW1lKGZvdW5kQ29sb3IubmFtZSksIGhleH0pO1xuXHR9KTtcblxuXHRyZXR1cm4gYWxsQ29sb3JzO1xufTtcblxuY29uc3QgZXhwYW5kID0gKGhleCkgPT4ge1xuXHRpZiAoKGhleC5sZW5ndGggPT09IDQpICYmIChoZXguY2hhckF0KDApID09PSAnIycpKSB7XG5cdFx0aGV4ID0gJyMnICsgaGV4LmNoYXJBdCgxKSArIGhleC5jaGFyQXQoMSkgKyBoZXguY2hhckF0KDIpICsgaGV4LmNoYXJBdCgyKSArIGhleC5jaGFyQXQoMykgKyBoZXguY2hhckF0KDMpO1xuXHR9XG5cdHJldHVybiBoZXgudG9VcHBlckNhc2UoKTtcbn07XG5cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIHN1cHBsaWVkIHN3YXRjaCBmaWxlLCByZXR1cm5zIGEgc3dhdGNoIG9iamVjdCwgZ2VuZXJhdGVzIFNDU1MvSlMgc291cmNlIHdpdGggY29sb3IgdmFyaWFibGVzLlxuICpcbiAqIEBwYXJhbSBzd2F0Y2hEYXRhIC0gSlNPTiBkYXRhIGdlbmVyYXRlZCBieSBhY29SZWFkZXJcbiAqIEByZXR1cm5zIHt7Y29sb3JzOiBBcnJheSwgc2Nzczogc3RyaW5nLCBqczogc3RyaW5nfX1cbiAqL1xuZXhwb3J0IGNvbnN0IHByb2Nlc3NTd2F0Y2ggPSBzd2F0Y2hEYXRhID0+IHtcblx0Y29uc3QgaGV4VmFsdWVzID0gc3dhdGNoRGF0YS5tYXAoc3dhdGNoID0+IHN3YXRjaC5oZXgpO1xuXHRjb25zdCBjb2xvcnMgPSBnZXRDb2xvck5hbWVzKGhleFZhbHVlcyk7XG5cdGNvbnN0IHNjc3MgPSBjb2xvcnMucmVkdWNlKChyZXN1bHQsIGNvbG9yKSA9PiBgJHtyZXN1bHR9JCR7Y29sb3IubmFtZX06ICcke2NvbG9yLmhleH0nO1xcbmAsIEZJTEVfSEVBREVSKTtcblx0Y29uc3QganNEYXRhID0gY29sb3JzLnJlZHVjZSgocmVzdWx0LCBjb2xvcikgPT4gYCR7cmVzdWx0fVxcdCR7Y29sb3IubmFtZS5yZXBsYWNlKC8tL2csICdfJyl9OiAnJHtjb2xvci5oZXh9JyxcXG5gLCAnJyk7XG5cdGNvbnN0IGpzID0gYCR7RklMRV9IRUFERVJ9ZXhwb3J0IGRlZmF1bHQge1xcbiR7anNEYXRhfX07YDtcblx0cmV0dXJuIHtjb2xvcnMsIHNjc3MsIGpzfTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBzcGVjaWFsIGNoYXJhY3RlcnMsIHNwYWNlcywgZGlhY3JpdGljcyBmcm9tIGlucHV0IHN0cmluZywgZW5zdXJlcyB0aGF0IHRoZSBzdHJpbmcgZG9lc24ndCBzdGFydCB3aXRoIGEgbnVtYmVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgaW5wdXQgY29sb3IgbmFtZTogXCIxOTc1IEVhcnRoJ3MgUmVkXCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXZpZGVyIC0gRGl2aWRlciBjaGFyYWN0ZXIgdGhhdCByZXBsYWNlcyBzcGFjZXM6IFwiLVwiXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBzYW5pdGl6ZWQgbmFtZSwgcmVhZHkgdG8gYmUgdXNlZCBhcyBhIHZhcmlhYmxlOiBcInRoZS0xOTc1LWVhcnRocy1yZWRcIlxuICovXG5leHBvcnQgY29uc3Qgc2FuaXRpemVDb2xvck5hbWUgPSAobmFtZSwgZGl2aWRlcj0nLScpID0+IHtcblx0cmV0dXJuIHJlbW92ZURpYWNyaXRpY3MobmFtZS50b0xvd2VyQ2FzZSgpKS5yZXBsYWNlKC9eKFxcZHsxfSkoLiopLywgJ3RoZS0kMSQyJykucmVwbGFjZSgvW15cXHd8XFxkfFxcc3wtXS9nLCAnJykucmVwbGFjZSgvXFxzL2csIGRpdmlkZXIpO1xufTtcblxuZXhwb3J0IHtlbmNvZGUsIGRlY29kZX0gZnJvbSAnLi9hY28nOyJdfQ==