From befd901c7e96e4b40e0c7bf3fc5eb2af4e23bd90 Mon Sep 17 00:00:00 2001 From: GoalSmashers Date: Wed, 28 Aug 2013 11:40:32 +0200 Subject: [PATCH] Fixes #65 - improve color name to hex and vice versa shortening. --- History.md | 5 ++ lib/clean.js | 28 +------ lib/color-shortening.js | 158 ++++++++++++++++++++++++++++++++++++++++ test/unit-test.js | 18 +++++ 4 files changed, 185 insertions(+), 24 deletions(-) create mode 100644 lib/color-shortening.js diff --git a/History.md b/History.md index 12f116a0..905d568b 100644 --- a/History.md +++ b/History.md @@ -1,3 +1,8 @@ +1.1.0 / 2013-xx-xx (UNRELEASED) +=================== + +* Fixed issue [#65](https://github.com/GoalSmashers/clean-css/issues/65) - full color name / hex shortening. + 1.0.12 / 2013-07-19 =================== diff --git a/lib/clean.js b/lib/clean.js index b15c119c..ab393280 100644 --- a/lib/clean.js +++ b/lib/clean.js @@ -9,29 +9,9 @@ var fs = require('fs'); var path = require('path'); var existsSync = fs.existsSync || path.existsSync; -var CleanCSS = { - colors: { - toHex: { - aqua: '#0ff', - black: '#000', - blue: '#00f', - fuchsia: '#f0f', - white: '#fff', - yellow: '#ff0' - }, - toName: { - '#000080': 'navy', - '#008000': 'green', - '#008080': 'teal', - '#800000': 'maroon', - '#800080': 'purple', - '#808000': 'olive', - '#808080': 'gray', - '#c0c0c0': 'silver', - '#f00': 'red' - } - }, +var colorShortening = require('../lib/color-shortening'); +var CleanCSS = { process: function(data, options) { var context = { specialComments: [], @@ -221,9 +201,9 @@ var CleanCSS = { // replace color name with hex values if shorter (or the other way around) ['toHex', 'toName'].forEach(function(type) { - var pattern = '(' + Object.keys(CleanCSS.colors[type]).join('|') + ')'; + var pattern = '(' + Object.keys(colorShortening[type]).join('|') + ')'; var colorSwitcher = function(match, prefix, colorValue, suffix) { - return prefix + CleanCSS.colors[type][colorValue.toLowerCase()] + suffix; + return prefix + colorShortening[type][colorValue.toLowerCase()] + suffix; }; replace(new RegExp('([ :,\\(])' + pattern + '([;\\}!\\) ])', 'ig'), colorSwitcher); replace(new RegExp('(,)' + pattern + '(,)', 'ig'), colorSwitcher); diff --git a/lib/color-shortening.js b/lib/color-shortening.js new file mode 100644 index 00000000..3603d4e1 --- /dev/null +++ b/lib/color-shortening.js @@ -0,0 +1,158 @@ +var COLORS = { + aliceblue: '#f0f8ff', + antiquewhite: '#faebd7', + aqua: '#0ff', + aquamarine: '#7fffd4', + azure: '#f0ffff', + beige: '#f5f5dc', + bisque: '#ffe4c4', + black: '#000', + blanchedalmond: '#ffebcd', + blue: '#00f', + blueviolet: '#8a2be2', + brown: '#a52a2a', + burlywood: '#deb887', + cadetblue: '#5f9ea0', + chartreuse: '#7fff00', + chocolate: '#d2691e', + coral: '#ff7f50', + cornflowerblue: '#6495ed', + cornsilk: '#fff8dc', + crimson: '#dc143c', + cyan: '#0ff', + darkblue: '#00008b', + darkcyan: '#008b8b', + darkgoldenrod: '#b8860b', + darkgray: '#a9a9a9', + darkgreen: '#006400', + darkkhaki: '#bdb76b', + darkmagenta: '#8b008b', + darkolivegreen: '#556b2f', + darkorange: '#ff8c00', + darkorchid: '#9932cc', + darkred: '#8b0000', + darksalmon: '#e9967a', + darkseagreen: '#8fbc8f', + darkslateblue: '#483d8b', + darkslategray: '#2f4f4f', + darkturquoise: '#00ced1', + darkviolet: '#9400d3', + deeppink: '#ff1493', + deepskyblue: '#00bfff', + dimgray: '#696969', + dodgerblue: '#1e90ff', + firebrick: '#b22222', + floralwhite: '#fffaf0', + forestgreen: '#228b22', + fuchsia: '#f0f', + gainsboro: '#dcdcdc', + ghostwhite: '#f8f8ff', + gold: '#ffd700', + goldenrod: '#daa520', + gray: '#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', + lightgreen: '#90ee90', + lightpink: '#ffb6c1', + lightsalmon: '#ffa07a', + lightseagreen: '#20b2aa', + lightskyblue: '#87cefa', + lightslategray: '#778899', + lightsteelblue: '#b0c4de', + lightyellow: '#ffffe0', + lime: '#0f0', + 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: '#f00', + rosybrown: '#bc8f8f', + royalblue: '#4169e1', + saddlebrown: '#8b4513', + salmon: '#fa8072', + sandybrown: '#f4a460', + seagreen: '#2e8b57', + seashell: '#fff5ee', + sienna: '#a0522d', + silver: '#c0c0c0', + skyblue: '#87ceeb', + slateblue: '#6a5acd', + slategray: '#708090', + snow: '#fffafa', + springgreen: '#00ff7f', + steelblue: '#4682b4', + tan: '#d2b48c', + teal: '#008080', + thistle: '#d8bfd8', + tomato: '#ff6347', + turquoise: '#40e0d0', + violet: '#ee82ee', + wheat: '#f5deb3', + white: '#fff', + whitesmoke: '#f5f5f5', + yellow: '#ff0', + yellowgreen: '#9acd32' +}; + +var toHex = {}; +var toName = {}; + +for (var name in COLORS) { + var color = COLORS[name]; + if (name.length < color.length) + toName[color] = name; + else + toHex[name] = color; +} + +module.exports = { + toHex: toHex, + toName: toName +}; diff --git a/test/unit-test.js b/test/unit-test.js index 8bcbd480..ad496931 100644 --- a/test/unit-test.js +++ b/test/unit-test.js @@ -2,6 +2,7 @@ var vows = require('vows'); var assert = require('assert'); var path = require('path'); var cleanCSS = require('../index'); +var colorShortening = require('../lib/color-shortening'); var lineBreak = process.platform == 'win32' ? '\r\n' : '\n'; var cssContext = function(groups, options) { @@ -30,6 +31,22 @@ var cssContext = function(groups, options) { return context; }; +var colorShorteningContext = function() { + var shortenerContext = {}; + + ['toName', 'toHex'].forEach(function(type) { + for (var from in colorShortening[type]) { + var to = colorShortening[type][from]; + shortenerContext['should turn ' + from + ' into ' + to] = [ + 'a{color:' + from + '}', + 'a{color:' + to + '}' + ]; + } + }); + + return cssContext(shortenerContext); +}; + vows.describe('clean-units').addBatch({ 'identity': cssContext({ 'preserve minified content': 'a{color:#f10}' @@ -551,6 +568,7 @@ vows.describe('clean-units').addBatch({ ], 'hsla not to hex': 'a{color:hsl(99,66%,33%,.5)}' }), + 'shortening colors': colorShorteningContext(), 'font weights': cssContext({ 'font-weight:normal to 400': [ 'p{font-weight:normal}', -- 2.34.1