Skip to content

Commit d9ab4b4

Browse files
Fixes stripping '%' from inside color functions.
The 'color' optimizer has to run after 'zero' optimizer as it restores '%' inside color functions if necessary.
1 parent 10422a3 commit d9ab4b4

File tree

4 files changed

+44
-17
lines changed

4 files changed

+44
-17
lines changed

History.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[5.1.0 / 2021-xx-xx](https://github.com/jakubpawlowicz/clean-css/compare/5.0...HEAD)
22
==================
33

4+
* Fixes stripping '%' from inside color functions.
45
* Improves tokenization speed by ~30%.
56

67
[5.0.1 / 2021-01-29](https://github.com/jakubpawlowicz/clean-css/compare/v5.0.0...v5.0.1)

lib/optimizer/configuration.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,8 @@ var configuration = {
218218
valueOptimizers.whiteSpace,
219219
valueOptimizers.urlWhiteSpace,
220220
valueOptimizers.fraction,
221-
valueOptimizers.color,
222221
valueOptimizers.zero,
222+
valueOptimizers.color,
223223
valueOptimizers.urlPrefix,
224224
valueOptimizers.urlQuotes
225225
]
@@ -269,8 +269,8 @@ var configuration = {
269269
valueOptimizers.urlPrefix,
270270
valueOptimizers.urlQuotes,
271271
valueOptimizers.whiteSpace,
272-
valueOptimizers.color,
273-
valueOptimizers.zero
272+
valueOptimizers.zero,
273+
valueOptimizers.color
274274
]
275275
},
276276
'background-origin': {
@@ -350,8 +350,8 @@ var configuration = {
350350
valueOptimizers: [
351351
valueOptimizers.whiteSpace,
352352
valueOptimizers.fraction,
353-
valueOptimizers.color,
354-
valueOptimizers.zero
353+
valueOptimizers.zero,
354+
valueOptimizers.color
355355
]
356356
},
357357
'border-bottom': {
@@ -372,8 +372,8 @@ var configuration = {
372372
valueOptimizers: [
373373
valueOptimizers.whiteSpace,
374374
valueOptimizers.fraction,
375-
valueOptimizers.color,
376-
valueOptimizers.zero
375+
valueOptimizers.zero,
376+
valueOptimizers.color
377377
]
378378
},
379379
'border-bottom-color': {
@@ -488,8 +488,8 @@ var configuration = {
488488
valueOptimizers: [
489489
valueOptimizers.whiteSpace,
490490
valueOptimizers.fraction,
491-
valueOptimizers.color,
492-
valueOptimizers.zero
491+
valueOptimizers.zero,
492+
valueOptimizers.color
493493
]
494494
},
495495
'border-left-color': {
@@ -653,9 +653,9 @@ var configuration = {
653653
valueOptimizers.whiteSpace,
654654
valueOptimizers.fraction,
655655
valueOptimizers.precision,
656+
valueOptimizers.zero,
656657
valueOptimizers.color,
657-
valueOptimizers.unit,
658-
valueOptimizers.zero
658+
valueOptimizers.unit
659659
]
660660
},
661661
'border-top-color': {
@@ -757,8 +757,8 @@ var configuration = {
757757
valueOptimizers.fraction,
758758
valueOptimizers.precision,
759759
valueOptimizers.unit,
760-
valueOptimizers.color,
761-
valueOptimizers.zero
760+
valueOptimizers.zero,
761+
valueOptimizers.color
762762
],
763763
vendorPrefixes: [
764764
'-moz-',
@@ -1281,9 +1281,9 @@ var configuration = {
12811281
defaultValue: 'none',
12821282
valueOptimizers: [
12831283
valueOptimizers.whiteSpace,
1284-
valueOptimizers.color,
12851284
valueOptimizers.fraction,
1286-
valueOptimizers.zero
1285+
valueOptimizers.zero,
1286+
valueOptimizers.color
12871287
]
12881288
},
12891289
'top': {

lib/optimizer/level-1/value-optimizers/color.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var shortenRgb = require('./color/shorten-rgb');
44

55
var split = require('../../../utils/split');
66

7+
var ANY_COLOR_FUNCTION_PATTERN = /(rgb|rgba|hsl|hsla)\(([^\(\)]+)\)/gi;
78
var COLOR_PREFIX_PATTERN = /#|rgb|hsl/gi;
89
var HEX_LONG_PATTERN = /(^|[^='"])#([0-9a-f]{6})/gi;
910
var HEX_SHORT_PATTERN = /(^|[^='"])#([0-9a-f]{3})/gi;
@@ -47,6 +48,28 @@ var plugin = {
4748
})
4849
.replace(HEX_SHORT_PATTERN, function (match, prefix, color) {
4950
return prefix + '#' + color.toLowerCase();
51+
})
52+
.replace(ANY_COLOR_FUNCTION_PATTERN, function (match, colorFunction, colorDef) {
53+
var tokens = colorDef.split(',');
54+
var colorFnLowercase = colorFunction && colorFunction.toLowerCase();
55+
var applies = (colorFnLowercase == 'hsl' && tokens.length == 3) ||
56+
(colorFnLowercase == 'hsla' && tokens.length == 4) ||
57+
(colorFnLowercase == 'rgb' && tokens.length === 3 && colorDef.indexOf('%') > 0) ||
58+
(colorFnLowercase == 'rgba' && tokens.length == 4 && colorDef.indexOf('%') > 0);
59+
60+
if (!applies) {
61+
return match;
62+
}
63+
64+
if (tokens[1].indexOf('%') == -1) {
65+
tokens[1] += '%';
66+
}
67+
68+
if (tokens[2].indexOf('%') == -1) {
69+
tokens[2] += '%';
70+
}
71+
72+
return colorFunction + '(' + tokens.join(',') + ')';
5073
});
5174

5275
if (options.compatibility.colors.opacity && name.indexOf('background') == -1) {

test/optimizer/level-1/optimize-test.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,11 +437,14 @@ vows.describe('level 1 optimizations')
437437
'.block{color: hsl(0, 0%, calc((var(--button_color_l) - 65) * -100%))}',
438438
'.block{color:hsl(0,0%,calc((var(--button_color_l) - 65) * -100%))}'
439439
],
440-
'rgba inside a function': [
440+
'rgba inside a function #1': [
441441
'.block{background-image:linear-gradient(to right,rgba(255,255,255,0),rgba(255,255,255,1))}',
442442
'.block{background-image:linear-gradient(to right,rgba(255,255,255,0),#fff)}'
443+
],
444+
'rgba inside a function #2': [
445+
'.block{background:linear-gradient(hsla(0,0%,98%,.8),hsla(0,0%,98%,.8)) 0 0/100% 1px no-repeat #f0de98}',
446+
'.block{background:linear-gradient(hsla(0,0%,98%,.8),hsla(0,0%,98%,.8)) 0 0/100% 1px no-repeat #f0de98}'
443447
]
444-
445448
}, { level: 1 })
446449
)
447450
.addBatch(

0 commit comments

Comments
 (0)