* Adds `process` method for compatibility with optimize-css-assets-webpack-plugin;
* new `transition` property optimizer;
* preserves any CSS content between `/* clean-css ignore:start */` and `/* clean-css ignore:end */` comments;
+* allows filtering based on selector in `transform` callback, see [example](#how-to-apply-arbitrary-transformations-to-css-properties);
## Constructor options
var output = new CleanCSS({
level: {
1: {
- transform: function (propertyName, propertyValue) {
+ transform: function (propertyName, propertyValue, selector /* `selector` available since 4.2.0-pre */) {
if (propertyName == 'background-image' && propertyValue.indexOf('/path/to') > -1) {
return propertyValue.replace('/path/to', '../valid/path/to');
}
var formatPosition = require('../../utils/format-position');
var split = require('../../utils/split');
+var serializeRules = require('../../writer/one-time').rules;
+
var IgnoreProperty = 'ignore-property';
var CHARSET_TOKEN = '@charset';
value;
}
-function transformValue(propertyName, propertyValue, transformCallback) {
- var transformedValue = transformCallback(propertyName, propertyValue);
+function transformValue(propertyName, propertyValue, rule, transformCallback) {
+ var selector = serializeRules(rule);
+ var transformedValue = transformCallback(propertyName, propertyValue, selector);
if (transformedValue === undefined) {
return propertyValue;
//
-function optimizeBody(properties, context) {
+function optimizeBody(rule, properties, context) {
var options = context.options;
var levelOptions = options.level[OptimizationLevel.One];
var property, name, type, value;
}
if (property.block) {
- optimizeBody(property.value[0][1], context);
+ optimizeBody(rule, property.value[0][1], context);
continue;
}
}
}
- value = transformValue(name, value, levelOptions.transform);
+ value = transformValue(name, value, rule, levelOptions.transform);
if (value === IgnoreProperty) {
property.unused = true;
mayHaveCharset = true;
break;
case Token.AT_RULE_BLOCK:
- optimizeBody(token[2], context);
+ optimizeBody(token[1], token[2], context);
afterRules = true;
break;
case Token.NESTED_BLOCK:
case Token.RULE:
token[1] = levelOptions.tidySelectors ? tidyRules(token[1], !ie7Hack, adjacentSpace, format, context.warnings) : token[1];
token[1] = token[1].length > 1 ? sortSelectors(token[1], levelOptions.selectorsSortingMethod) : token[1];
- optimizeBody(token[2], context);
+ optimizeBody(token[1], token[2], context);
afterRules = true;
break;
}
assert.equal(output.styles, '.block{border-image:url(image.png)}');
}
},
+ 'allows dropping properties based on selector': {
+ 'topic': function () {
+ return new CleanCSS({
+ level: {
+ 1: {
+ transform: function (propertyName, propertyValue, selector) {
+ if (propertyName.indexOf('-o-') === 0 && selector == '.block-2') {
+ return false;
+ }
+ }
+ }
+ }
+ }).minify('.block-1{-o-border-radius:2px}.block-2{-o-border-radius:5px;width:1rem}');
+ },
+ 'gives right output': function (error, output) {
+ assert.equal(output.styles, '.block-1{-o-border-radius:2px}.block-2{width:1rem}');
+ }
+ },
'combined with level 2 optimization': {
'topic': function () {
return new CleanCSS({