Fixes #65 - improve color name to hex and vice versa shortening.
authorGoalSmashers <jakub@goalsmashers.com>
Wed, 28 Aug 2013 09:40:32 +0000 (11:40 +0200)
committerGoalSmashers <jakub@goalsmashers.com>
Wed, 28 Aug 2013 09:40:32 +0000 (11:40 +0200)
History.md
lib/clean.js
lib/color-shortening.js [new file with mode: 0644]
test/unit-test.js

index 12f116a..905d568 100644 (file)
@@ -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
 ===================
 
index b15c119..ab39328 100644 (file)
@@ -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 (file)
index 0000000..3603d4e
--- /dev/null
@@ -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
+};
index 8bcbd48..ad49693 100644 (file)
@@ -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}',