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
JavaScript
;
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==