From 570ba63b7e9f3dc21d2c12605e0c8138cbff4fdc Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Wed, 25 Feb 2015 22:19:29 +0000 Subject: [PATCH] Adds `--skip-restructuring` / `restructuring` switches. Adds a CLI & API switches to turn off restructuring, which is on by default. --- README.md | 2 ++ bin/cleancss | 2 ++ lib/clean.js | 1 + lib/selectors/optimizers/advanced.js | 2 +- test/binary-test.js | 5 +++++ test/module-test.js | 14 ++++++++++++++ test/selectors/optimizer-test.js | 1 + 7 files changed, 26 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d625cd0..ae5618e9 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,7 @@ cleancss [options] source-file, [source-file, ...] reduction, etc. --skip-aggressive-merging Disable properties merging based on their order --skip-media-merging Disable `@media` merging +--skip-restructuring Disable restructuring optimizations --skip-shorthand-compacting Disable shorthand compacting --rounding-precision [N] Rounds to `N` decimal places. Defaults to 2. -1 disables rounding. -c, --compatibility [ie7|ie8] Force compatibility mode (see Readme for advanced examples) @@ -123,6 +124,7 @@ CleanCSS constructor accepts a hash as a parameter, i.e., * `processImport` - whether to process `@import` rules * `rebase` - set to false to skip URL rebasing * `relativeTo` - path to __resolve__ relative `@import` rules and URLs +* `restructuring` - set to false to disable restructuring in advanced optimizations * `root` - path to __resolve__ absolute `@import` rules and __rebase__ relative URLs * `roundingPrecision` - rounding precision; defaults to `2`; `-1` disables rounding * `shorthandCompacting` - set to false to skip shorthand compacting (default is true unless sourceMap is set when it's false) diff --git a/bin/cleancss b/bin/cleancss index 3dd22674..91a5fcd0 100755 --- a/bin/cleancss +++ b/bin/cleancss @@ -26,6 +26,7 @@ commands .option('--skip-advanced', 'Disable advanced optimizations - selector & property merging, reduction, etc.') .option('--skip-aggressive-merging', 'Disable properties merging based on their order') .option('--skip-media-merging', 'Disable @media merging') + .option('--skip-restructuring', 'Disable restructuring optimizations') .option('--skip-shorthand-compacting', 'Disable shorthand compacting') .option('--rounding-precision [n]', 'Rounds to `N` decimal places. Defaults to 2. -1 disables rounding.', parseInt) .option('-c, --compatibility [ie7|ie8]', 'Force compatibility mode (see Readme for advanced examples)') @@ -68,6 +69,7 @@ var options = { mediaMerging: commands.skipMediaMerging ? false : true, processImport: commands.skipImport ? false : true, rebase: commands.skipRebase ? false : true, + restructuring: commands.skipRestructuring ? false : true, root: commands.root, roundingPrecision: commands.roundingPrecision, shorthandCompacting: commands.skipShorthandCompacting ? false : true, diff --git a/lib/clean.js b/lib/clean.js index caf9e297..daa778fb 100644 --- a/lib/clean.js +++ b/lib/clean.js @@ -39,6 +39,7 @@ var CleanCSS = module.exports = function CleanCSS(options) { processImport: undefined === options.processImport ? true : !!options.processImport, rebase: undefined === options.rebase ? true : !!options.rebase, relativeTo: options.relativeTo, + restructuring: undefined === options.restructuring ? true : !!options.restructuring, root: options.root, roundingPrecision: options.roundingPrecision, shorthandCompacting: !!options.sourceMap ? false : (undefined === options.shorthandCompacting ? true : !!options.shorthandCompacting), diff --git a/lib/selectors/optimizers/advanced.js b/lib/selectors/optimizers/advanced.js index fe2bc605..310a855b 100644 --- a/lib/selectors/optimizers/advanced.js +++ b/lib/selectors/optimizers/advanced.js @@ -718,7 +718,7 @@ AdvancedOptimizer.prototype.optimize = function (tokens) { self.mergeNonAdjacentBySelector(tokens); self.mergeNonAdjacentByBody(tokens); - if (withRestructuring) { + if (self.options.restructuring && withRestructuring) { self.restructure(tokens); self.mergeAdjacent(tokens); } diff --git a/test/binary-test.js b/test/binary-test.js index 1cc3b979..48ba90cd 100644 --- a/test/binary-test.js +++ b/test/binary-test.js @@ -130,6 +130,11 @@ exports.commandsSuite = vows.describe('binary commands').addBatch({ assert.equal(stdout, 'a{color:red}p{color:red}'); } }), + 'skip restructuring optimizations': pipedContext('div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}', '--skip-restructuring', { + 'should do basic optimizations only': function(error, stdout) { + assert.equal(stdout, 'div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}'); + } + }), 'no relative to path': binaryContext('./test/fixtures/partials-absolute/base.css', { 'should not be able to resolve it fully': function(error, stdout, stderr) { assert.isEmpty(stdout); diff --git a/test/module-test.js b/test/module-test.js index 3e32f2a3..7eb12f7f 100644 --- a/test/module-test.js +++ b/test/module-test.js @@ -312,6 +312,20 @@ vows.describe('module tests').addBatch({ 'gets right output': function (minified) { assert.include(minified.styles, 'url(/test/fixtures/dummy.png)'); } + }, + 'restructuring': { + 'on': { + 'topic': new CleanCSS({ restructuring: true }).minify('div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}'), + 'gets right output': function (minified) { + assert.equal(minified.styles, '.two,div{margin-top:0}.one{margin:0}.two{display:block}'); + } + }, + 'off': { + 'topic': new CleanCSS({ restructuring: false }).minify('div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}'), + 'gets right output': function (minified) { + assert.equal(minified.styles, 'div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}'); + } + } } }, 'source map': { diff --git a/test/selectors/optimizer-test.js b/test/selectors/optimizer-test.js index 22b6e8b1..716fef59 100644 --- a/test/selectors/optimizer-test.js +++ b/test/selectors/optimizer-test.js @@ -10,6 +10,7 @@ function optimizerContext(group, specs, options) { var context = {}; options = options || {}; options.shorthandCompacting = true; + options.restructuring = true; options.compatibility = new Compatibility(options.compatibility).toOptions(); function optimized(target) { -- 2.34.1