diff --git a/History.md b/History.md index 782ee6a78..6d43df3cd 100644 --- a/History.md +++ b/History.md @@ -1,6 +1,7 @@ [4.1.8 / 2017-xx-xx](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.7...4.1) ================== +* Fixed issue [#959](https://github.com/jakubpawlowicz/clean-css/issues/959) - regression in shortening long hex values. * Fixed issue [#960](https://github.com/jakubpawlowicz/clean-css/issues/960) - better explanation of `efficiency` stat. [4.1.7 / 2017-07-14](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.6...v4.1.7) diff --git a/lib/optimizer/level-1/optimize.js b/lib/optimizer/level-1/optimize.js index 82cb9531d..ebc3c2415 100644 --- a/lib/optimizer/level-1/optimize.js +++ b/lib/optimizer/level-1/optimize.js @@ -29,6 +29,7 @@ var DEFAULT_ROUNDING_PRECISION = require('../../options/rounding-precision').DEF var WHOLE_PIXEL_VALUE = /(?:^|\s|\()(-?\d+)px/; var TIME_VALUE = /^(\-?[\d\.]+)(m?s)$/; +var HEX_VALUE_PATTERN = /[0-9a-f]/i; var PROPERTY_NAME_PATTERN = /^(?:\-chrome\-|\-[\w\-]+\w|\w[\w\-]+\w|\-\-\S+)$/; var IMPORT_PREFIX_PATTERN = /^@import/i; var QUOTED_PATTERN = /^('.*'|".*")$/; @@ -98,11 +99,15 @@ function optimizeColors(name, value, compatibility) { .replace(/hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/g, function (match, hue, saturation, lightness) { return shortenHsl(hue, saturation, lightness); }) - .replace(/(^|[^='"])#([0-9a-f]{6})($|[^0-9a-f])/gi, function (match, prefix, color, suffix) { - if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) { - return (prefix + '#' + color[0] + color[2] + color[4]).toLowerCase() + suffix; + .replace(/(^|[^='"])#([0-9a-f]{6})/gi, function (match, prefix, color, at, inputValue) { + var suffix = inputValue[at + match.length]; + + if (suffix && HEX_VALUE_PATTERN.test(suffix)) { + return match; + } else if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) { + return (prefix + '#' + color[0] + color[2] + color[4]).toLowerCase(); } else { - return (prefix + '#' + color).toLowerCase() + suffix; + return (prefix + '#' + color).toLowerCase(); } }) .replace(/(^|[^='"])#([0-9a-f]{3})/gi, function (match, prefix, color) { diff --git a/test/optimizer/level-1/optimize-test.js b/test/optimizer/level-1/optimize-test.js index 9dd549d15..7f2d477e1 100644 --- a/test/optimizer/level-1/optimize-test.js +++ b/test/optimizer/level-1/optimize-test.js @@ -401,6 +401,10 @@ vows.describe('level 1 optimizations') 'a{color:#FFF}', 'a{color:#fff}' ], + 'uppercase long hex to lowercase hex inside gradient 1234': [ + '.block{background-image:linear-gradient(to top,#AABBCC,#FFFFFF)}', + '.block{background-image:linear-gradient(to top,#abc,#fff)}' + ], '4-value hex': [ '.block{color:#0f0a}', '.block{color:#0f0a}'