| 'use strict'; |
| |
| exports.type = 'perItem'; |
| |
| exports.active = true; |
| |
| exports.description = 'converts colors: rgb() to #rrggbb and #rrggbb to #rgb'; |
| |
| exports.params = { |
| currentColor: false, |
| names2hex: true, |
| rgb2hex: true, |
| shorthex: true, |
| shortname: true |
| }; |
| |
| var collections = require('./_collections'), |
| rNumber = '([+-]?(?:\\d*\\.\\d+|\\d+\\.?)%?)', |
| rComma = '\\s*,\\s*', |
| regRGB = new RegExp('^rgb\\(\\s*' + rNumber + rComma + rNumber + rComma + rNumber + '\\s*\\)$'), |
| regHEX = /^\#(([a-fA-F0-9])\2){3}$/, |
| none = /\bnone\b/i; |
| |
| /** |
| * Convert different colors formats in element attributes to hex. |
| * |
| * @see http://www.w3.org/TR/SVG/types.html#DataTypeColor |
| * @see http://www.w3.org/TR/SVG/single-page.html#types-ColorKeywords |
| * |
| * @example |
| * Convert color name keyword to long hex: |
| * fuchsia ➡ #ff00ff |
| * |
| * Convert rgb() to long hex: |
| * rgb(255, 0, 255) ➡ #ff00ff |
| * rgb(50%, 100, 100%) ➡ #7f64ff |
| * |
| * Convert long hex to short hex: |
| * #aabbcc ➡ #abc |
| * |
| * Convert hex to short name |
| * #000080 ➡ navy |
| * |
| * @param {Object} item current iteration item |
| * @param {Object} params plugin params |
| * @return {Boolean} if false, item will be filtered out |
| * |
| * @author Kir Belevich |
| */ |
| exports.fn = function(item, params) { |
| |
| if (item.elem) { |
| |
| item.eachAttr(function(attr) { |
| |
| if (collections.colorsProps.indexOf(attr.name) > -1) { |
| |
| var val = attr.value, |
| match; |
| |
| // Convert colors to currentColor |
| if (params.currentColor) { |
| if (typeof params.currentColor === 'string') { |
| match = val === params.currentColor; |
| } else if (params.currentColor.exec) { |
| match = params.currentColor.exec(val); |
| } else { |
| match = !val.match(none); |
| } |
| if (match) { |
| val = 'currentColor'; |
| } |
| } |
| |
| // Convert color name keyword to long hex |
| if (params.names2hex && val.toLowerCase() in collections.colorsNames) { |
| val = collections.colorsNames[val.toLowerCase()]; |
| } |
| |
| // Convert rgb() to long hex |
| if (params.rgb2hex && (match = val.match(regRGB))) { |
| match = match.slice(1, 4).map(function(m) { |
| if (m.indexOf('%') > -1) |
| m = Math.round(parseFloat(m) * 2.55); |
| |
| return Math.max(0, Math.min(m, 255)); |
| }); |
| |
| val = rgb2hex(match); |
| } |
| |
| // Convert long hex to short hex |
| if (params.shorthex && (match = val.match(regHEX))) { |
| val = '#' + match[0][1] + match[0][3] + match[0][5]; |
| } |
| |
| // Convert hex to short name |
| if (params.shortname) { |
| var lowerVal = val.toLowerCase(); |
| if (lowerVal in collections.colorsShortNames) { |
| val = collections.colorsShortNames[lowerVal]; |
| } |
| } |
| |
| attr.value = val; |
| |
| } |
| |
| }); |
| |
| } |
| |
| }; |
| |
| /** |
| * Convert [r, g, b] to #rrggbb. |
| * |
| * @see https://gist.github.com/983535 |
| * |
| * @example |
| * rgb2hex([255, 255, 255]) // '#ffffff' |
| * |
| * @param {Array} rgb [r, g, b] |
| * @return {String} #rrggbb |
| * |
| * @author Jed Schmidt |
| */ |
| function rgb2hex(rgb) { |
| return '#' + ('00000' + (rgb[0] << 16 | rgb[1] << 8 | rgb[2]).toString(16)).slice(-6).toUpperCase(); |
| } |