From: Jakub Pawlowicz Date: Mon, 13 Apr 2015 20:31:09 +0000 (+0100) Subject: Fixes #508 - removing duplicate media queries. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=09e2ed80fb0e690acc1502aef4bb4020104de4a3;p=clean-css.git Fixes #508 - removing duplicate media queries. It's same as with duplicated properties - they can be removed no matter what. --- diff --git a/History.md b/History.md index 7c0fffae..6a06dc83 100644 --- a/History.md +++ b/History.md @@ -15,6 +15,7 @@ * Fixed issue [#490](https://github.com/jakubpawlowicz/clean-css/issues/490) - vendor prefixed multivalue `background`. * Fixed issue [#500](https://github.com/jakubpawlowicz/clean-css/issues/500) - merging duplicate adjacent properties. * Fixed issue [#507](https://github.com/jakubpawlowicz/clean-css/issues/507) - merging longhands into many shorthands. +* Fixed issue [#508](https://github.com/jakubpawlowicz/clean-css/issues/508) - removing duplicate media queries. [3.1.9 / 2015-04-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.8...v3.1.9) ================== diff --git a/lib/selectors/optimizers/advanced.js b/lib/selectors/optimizers/advanced.js index 1df89465..fb3d0f58 100644 --- a/lib/selectors/optimizers/advanced.js +++ b/lib/selectors/optimizers/advanced.js @@ -4,6 +4,7 @@ var CleanUp = require('./clean-up'); var extractProperties = require('../extractor'); var canReorder = require('../reorderable').canReorder; var canReorderSingle = require('../reorderable').canReorderSingle; +var stringifyAll = require('../../stringifier/one-time').all; var stringifyBody = require('../../stringifier/one-time').body; var stringifySelectors = require('../../stringifier/one-time').selectors; @@ -617,6 +618,24 @@ AdvancedOptimizer.prototype.restructure = function (tokens) { } }; +AdvancedOptimizer.prototype.removeDuplicateMediaQueries = function (tokens) { + var candidates = {}; + + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + if (token[0] != 'block') + continue; + + var key = token[1][0] + '%' + stringifyAll(token[2]); + var candidate = candidates[key]; + + if (candidate) + candidate[2] = []; + + candidates[key] = token; + } +}; + AdvancedOptimizer.prototype.mergeMediaQueries = function (tokens) { var candidates = {}; var reduced = []; @@ -724,6 +743,7 @@ AdvancedOptimizer.prototype.optimize = function (tokens) { } if (self.options.mediaMerging) { + self.removeDuplicateMediaQueries(tokens); var reduced = self.mergeMediaQueries(tokens); for (var i = reduced.length - 1; i >= 0; i--) { _optimize(reduced[i][2]); diff --git a/lib/stringifier/one-time.js b/lib/stringifier/one-time.js index f70551dc..4a65c7f2 100644 --- a/lib/stringifier/one-time.js +++ b/lib/stringifier/one-time.js @@ -11,6 +11,12 @@ function context() { }; } +function all(tokens) { + var fakeContext = context(); + helpers.all(tokens, fakeContext); + return fakeContext.output.join(''); +} + function body(tokens) { var fakeContext = context(); helpers.body(tokens, fakeContext); @@ -36,6 +42,7 @@ function value(tokens, position) { } module.exports = { + all: all, body: body, property: property, selectors: selectors, diff --git a/test/media-queries-test.js b/test/media-queries-test.js index 7886e388..3a54c9aa 100644 --- a/test/media-queries-test.js +++ b/test/media-queries-test.js @@ -109,6 +109,22 @@ vows.describe('media queries') 'get merged': function(minified) { assert.equal(minified.styles, '@media (min-width:1024px){.one{color:red}}@media screen{a{color:red}div{display:block}}'); } + }, + 'duplicated but non-mergeable': { + 'topic': function () { + return new CleanCSS().minify('@media screen{a{color:red}}.one{color:#000}@media screen{a{color:red}}'); + }, + 'get merged': function(minified) { + assert.equal(minified.styles, '.one{color:#000}@media screen{a{color:red}}'); + } + }, + 'many duplicated but non-mergeable': { + 'topic': function () { + return new CleanCSS().minify('@media print{a{color:#fff}}@media screen{a{color:red}}.one{color:#000}@media screen{a{color:red}}@media print{a{display:block}}@media print{a{color:#fff}}'); + }, + 'get merged': function(minified) { + assert.equal(minified.styles, '.one{color:#000}@media screen{a{color:red}}@media print{a{display:block;color:#fff}}'); + } } }) .addBatch({