From 79a1a06890aa3a18ff7a153f7c85e29118fe4d85 Mon Sep 17 00:00:00 2001 From: Ward Peeters Date: Mon, 25 May 2015 15:27:58 +0200 Subject: [PATCH] Use exclude config from CSSComb --- Gruntfile.js | 12 +- tasks/csscomb.js | 65 +++- test/csscomb_test.js | 19 +- test/expected/exclude1.css | 19 ++ test/expected/exclude2-notignored.css | 17 + test/expected/exclude2.css | 13 + test/fixtures/excludes/exclude1.css | 13 + test/fixtures/excludes/exclude1.resorted.css | 19 ++ test/fixtures/excludes/exclude2.css | 13 + test/fixtures/excludes/exclude2.resorted.css | 13 + test/fixtures/excludes/excludes.json | 329 +++++++++++++++++++ 11 files changed, 520 insertions(+), 12 deletions(-) create mode 100644 test/expected/exclude1.css create mode 100644 test/expected/exclude2-notignored.css create mode 100644 test/expected/exclude2.css create mode 100644 test/fixtures/excludes/exclude1.css create mode 100644 test/fixtures/excludes/exclude1.resorted.css create mode 100644 test/fixtures/excludes/exclude2.css create mode 100644 test/fixtures/excludes/exclude2.resorted.css create mode 100644 test/fixtures/excludes/excludes.json diff --git a/Gruntfile.js b/Gruntfile.js index fac8a87..7c8b493 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -54,6 +54,16 @@ module.exports = function (grunt) { src: ['*.css', '!*.resorted.css'], dest: 'test/fixtures/dest/', ext: '.resorted.css' + }, + excludes: { + options: { + config: 'test/fixtures/excludes/excludes.json' + }, + expand: true, + cwd: 'test/fixtures/excludes/', + src: ['*.css', '!*.resorted.css'], + dest: 'test/fixtures/excludes/', + ext: '.resorted.css' } }, @@ -79,4 +89,4 @@ module.exports = function (grunt) { // By default, lint and run all tests. grunt.registerTask('default', ['jshint', 'test']); -}; \ No newline at end of file +}; diff --git a/tasks/csscomb.js b/tasks/csscomb.js index 305f3f3..62d2a1a 100644 --- a/tasks/csscomb.js +++ b/tasks/csscomb.js @@ -72,20 +72,65 @@ module.exports = function (grunt) { } }).forEach(function (src) { - // Get CSS from a source file: - var css = grunt.file.read(src); + // Placeholder for our css content + var css; var combed; - // Comb it: - grunt.log.ok('Sorting file "' + src + '"...'); - var syntax = src.split('.').pop(); - try { - combed = comb.processString(css, { syntax: syntax }); - grunt.file.write(f.dest, combed); - } catch(e) { - grunt.log.error(e); + if (shouldProcess(src, config)) { + + // Get CSS from a source file: + css = grunt.file.read(src); + + // Comb it: + grunt.log.ok('Sorting file "' + src + '"...'); + var syntax = src.split('.').pop(); + + try { + combed = comb.processString(css, { syntax: syntax }); + grunt.file.write(f.dest, combed); + } catch(e) { + grunt.log.error(e); + } + } else { + grunt.log.ok('Skipping file "' + src + '" because of exclude.'); + grunt.file.copy(src, f.dest); } }); }); }); + + function shouldProcess(src, config) { + var excludes = zip( + (config.exclude || []).map(function(pattern) { + return grunt.file.expand(pattern); + }) + ); + var ok = true; + + if (excludes) { + var found = false; + src = src.replace(/^\.\//, ''); + for (var i = 0, excludeLength = excludes.length; i < excludeLength && !found; i++) { + if (excludes[i].match(src)) { + found = true; + } + } + + ok = ok && !found; + } + + return ok; + } + + function zip(arrays) { + var returnArray = []; + + arrays.forEach(function(value) { + value.forEach(function(item) { + returnArray.push(item); + }); + }); + + return returnArray; + } }; diff --git a/test/csscomb_test.js b/test/csscomb_test.js index 2ee9207..792b348 100644 --- a/test/csscomb_test.js +++ b/test/csscomb_test.js @@ -45,6 +45,23 @@ exports.csscomb = { var expected2 = grunt.file.read('test/expected/multi2.css'); test.equal(actual2, expected2, 'sholud be sorted.'); + test.done(); + }, + excludes: function (test) { + test.expect(3); + + var actual = grunt.file.read('test/fixtures/excludes/exclude1.resorted.css'); + var expected = grunt.file.read('test/expected/exclude1.css'); + test.equal(actual, expected, 'should be sorted.'); + + var actual2 = grunt.file.read('test/fixtures/excludes/exclude2.resorted.css'); + var expected2 = grunt.file.read('test/expected/exclude2.css'); + test.equal(actual2, expected2, 'should be sorted.'); + + var actual3 = grunt.file.read('test/fixtures/excludes/exclude2.resorted.css'); + var expected3 = grunt.file.read('test/expected/exclude2-notignored.css'); + test.notEqual(actual3, expected3, 'should not be sorted.'); + test.done(); } -}; \ No newline at end of file +}; diff --git a/test/expected/exclude1.css b/test/expected/exclude1.css new file mode 100644 index 0000000..03eaba8 --- /dev/null +++ b/test/expected/exclude1.css @@ -0,0 +1,19 @@ +.exclude1 +{ + font-weight: bold; + + z-index: 100; + + display: block; + visibility: hidden; + + width: 100px; + height: 100px; + max-height: 44px; + + text-align: center; + vertical-align: 5px; + + border-color: 1px #000 solid; + background-color: red; +} diff --git a/test/expected/exclude2-notignored.css b/test/expected/exclude2-notignored.css new file mode 100644 index 0000000..aa18bb7 --- /dev/null +++ b/test/expected/exclude2-notignored.css @@ -0,0 +1,17 @@ +.expected2 +{ + position: absolute; + z-index: 10; + top: 10px; + left: 10px; + + display: table; + float: left; + + width: 10px; + height: 10px; + margin: 10px; + padding: 10px; + + border: 1px #fff solid; +} diff --git a/test/expected/exclude2.css b/test/expected/exclude2.css new file mode 100644 index 0000000..1bb77f4 --- /dev/null +++ b/test/expected/exclude2.css @@ -0,0 +1,13 @@ +.exclude2 { + position: absolute; + top: 10px; + left: 10px; + z-index: 10; + display: table; + float: left; + margin: 10px; + padding: 10px; + width: 10px; + height: 10px; + border: 1px #fff solid; +} \ No newline at end of file diff --git a/test/fixtures/excludes/exclude1.css b/test/fixtures/excludes/exclude1.css new file mode 100644 index 0000000..42a9d64 --- /dev/null +++ b/test/fixtures/excludes/exclude1.css @@ -0,0 +1,13 @@ +.exclude1 { + z-index: 100; + display: block; + visibility: hidden; + max-height: 44px; + width: 100px; + height: 100px; + border-color: 1px #000 solid; + background-color: red; + vertical-align: 5px; + text-align: center; + font-weight: bold; +} \ No newline at end of file diff --git a/test/fixtures/excludes/exclude1.resorted.css b/test/fixtures/excludes/exclude1.resorted.css new file mode 100644 index 0000000..03eaba8 --- /dev/null +++ b/test/fixtures/excludes/exclude1.resorted.css @@ -0,0 +1,19 @@ +.exclude1 +{ + font-weight: bold; + + z-index: 100; + + display: block; + visibility: hidden; + + width: 100px; + height: 100px; + max-height: 44px; + + text-align: center; + vertical-align: 5px; + + border-color: 1px #000 solid; + background-color: red; +} diff --git a/test/fixtures/excludes/exclude2.css b/test/fixtures/excludes/exclude2.css new file mode 100644 index 0000000..1bb77f4 --- /dev/null +++ b/test/fixtures/excludes/exclude2.css @@ -0,0 +1,13 @@ +.exclude2 { + position: absolute; + top: 10px; + left: 10px; + z-index: 10; + display: table; + float: left; + margin: 10px; + padding: 10px; + width: 10px; + height: 10px; + border: 1px #fff solid; +} \ No newline at end of file diff --git a/test/fixtures/excludes/exclude2.resorted.css b/test/fixtures/excludes/exclude2.resorted.css new file mode 100644 index 0000000..1bb77f4 --- /dev/null +++ b/test/fixtures/excludes/exclude2.resorted.css @@ -0,0 +1,13 @@ +.exclude2 { + position: absolute; + top: 10px; + left: 10px; + z-index: 10; + display: table; + float: left; + margin: 10px; + padding: 10px; + width: 10px; + height: 10px; + border: 1px #fff solid; +} \ No newline at end of file diff --git a/test/fixtures/excludes/excludes.json b/test/fixtures/excludes/excludes.json new file mode 100644 index 0000000..66c526b --- /dev/null +++ b/test/fixtures/excludes/excludes.json @@ -0,0 +1,329 @@ +{ + "exclude": [ + ".git/**", + "node_modules/**", + "bower_components/**", + "**/exclude2.css" + ], + "always-semicolon": true, + "block-indent": " ", + "color-case": "lower", + "color-shorthand": true, + "element-case": "lower", + "eof-newline": true, + "leading-zero": false, + "quotes": "single", + "remove-empty-rulesets": true, + "space-after-colon": " ", + "space-after-combinator": " ", + "space-after-opening-brace": "\n", + "space-after-selector-delimiter": "\n", + "space-before-closing-brace": "\n", + "space-before-colon": "", + "space-before-combinator": " ", + "space-before-opening-brace": "\n", + "space-before-selector-delimiter": "", + "strip-spaces": true, + "unitless-zero": true, + "vendor-prefix-align": true, + "sort-order": [ + [ + "font", + "font-family", + "font-size", + "font-weight", + "font-style", + "font-variant", + "font-size-adjust", + "font-stretch", + "font-effect", + "font-emphasize", + "font-emphasize-position", + "font-emphasize-style", + "font-smooth", + "line-height" + ], + [ + "position", + "z-index", + "top", + "right", + "bottom", + "left" + ], + [ + "display", + "visibility", + "float", + "clear", + "overflow", + "overflow-x", + "overflow-y", + "-ms-overflow-x", + "-ms-overflow-y", + "clip", + "zoom", + "flex-direction", + "flex-order", + "flex-pack", + "flex-align" + ], + [ + "-webkit-box-sizing", + "-moz-box-sizing", + "box-sizing", + "width", + "min-width", + "max-width", + "height", + "min-height", + "max-height", + "margin", + "margin-top", + "margin-right", + "margin-bottom", + "margin-left", + "padding", + "padding-top", + "padding-right", + "padding-bottom", + "padding-left" + ], + [ + "table-layout", + "empty-cells", + "caption-side", + "border-spacing", + "border-collapse", + "list-style", + "list-style-position", + "list-style-type", + "list-style-image" + ], + [ + "content", + "quotes", + "counter-reset", + "counter-increment", + "resize", + "cursor", + "-webkit-user-select", + "-moz-user-select", + "-ms-user-select", + "user-select", + "nav-index", + "nav-up", + "nav-right", + "nav-down", + "nav-left", + "-webkit-transition", + "-moz-transition", + "-ms-transition", + "-o-transition", + "transition", + "-webkit-transition-delay", + "-moz-transition-delay", + "-ms-transition-delay", + "-o-transition-delay", + "transition-delay", + "-webkit-transition-timing-function", + "-moz-transition-timing-function", + "-ms-transition-timing-function", + "-o-transition-timing-function", + "transition-timing-function", + "-webkit-transition-duration", + "-moz-transition-duration", + "-ms-transition-duration", + "-o-transition-duration", + "transition-duration", + "-webkit-transition-property", + "-moz-transition-property", + "-ms-transition-property", + "-o-transition-property", + "transition-property", + "-webkit-transform", + "-moz-transform", + "-ms-transform", + "-o-transform", + "transform", + "-webkit-transform-origin", + "-moz-transform-origin", + "-ms-transform-origin", + "-o-transform-origin", + "transform-origin", + "-webkit-animation", + "-moz-animation", + "-ms-animation", + "-o-animation", + "animation", + "-webkit-animation-name", + "-moz-animation-name", + "-ms-animation-name", + "-o-animation-name", + "animation-name", + "-webkit-animation-duration", + "-moz-animation-duration", + "-ms-animation-duration", + "-o-animation-duration", + "animation-duration", + "-webkit-animation-play-state", + "-moz-animation-play-state", + "-ms-animation-play-state", + "-o-animation-play-state", + "animation-play-state", + "-webkit-animation-timing-function", + "-moz-animation-timing-function", + "-ms-animation-timing-function", + "-o-animation-timing-function", + "animation-timing-function", + "-webkit-animation-delay", + "-moz-animation-delay", + "-ms-animation-delay", + "-o-animation-delay", + "animation-delay", + "-webkit-animation-iteration-count", + "-moz-animation-iteration-count", + "-ms-animation-iteration-count", + "-o-animation-iteration-count", + "animation-iteration-count", + "-webkit-animation-direction", + "-moz-animation-direction", + "-ms-animation-direction", + "-o-animation-direction", + "animation-direction", + "text-align", + "-webkit-text-align-last", + "-moz-text-align-last", + "-ms-text-align-last", + "text-align-last", + "vertical-align", + "white-space", + "text-decoration", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-style", + "text-emphasis-position", + "text-indent", + "-ms-text-justify", + "text-justify", + "letter-spacing", + "word-spacing", + "-ms-writing-mode", + "text-outline", + "text-transform", + "text-wrap", + "text-overflow", + "-ms-text-overflow", + "text-overflow-ellipsis", + "text-overflow-mode", + "-ms-word-wrap", + "word-wrap", + "word-break", + "-ms-word-break", + "-moz-tab-size", + "-o-tab-size", + "tab-size", + "-webkit-hyphens", + "-moz-hyphens", + "hyphens", + "pointer-events" + ], + [ + "opacity", + "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity", + "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha", + "-ms-interpolation-mode", + "color", + "border", + "border-width", + "border-style", + "border-color", + "border-top", + "border-top-width", + "border-top-style", + "border-top-color", + "border-right", + "border-right-width", + "border-right-style", + "border-right-color", + "border-bottom", + "border-bottom-width", + "border-bottom-style", + "border-bottom-color", + "border-left", + "border-left-width", + "border-left-style", + "border-left-color", + "-webkit-border-radius", + "-moz-border-radius", + "border-radius", + "-webkit-border-top-left-radius", + "-moz-border-radius-topleft", + "border-top-left-radius", + "-webkit-border-top-right-radius", + "-moz-border-radius-topright", + "border-top-right-radius", + "-webkit-border-bottom-right-radius", + "-moz-border-radius-bottomright", + "border-bottom-right-radius", + "-webkit-border-bottom-left-radius", + "-moz-border-radius-bottomleft", + "border-bottom-left-radius", + "-webkit-border-image", + "-moz-border-image", + "-o-border-image", + "border-image", + "-webkit-border-image-source", + "-moz-border-image-source", + "-o-border-image-source", + "border-image-source", + "-webkit-border-image-slice", + "-moz-border-image-slice", + "-o-border-image-slice", + "border-image-slice", + "-webkit-border-image-width", + "-moz-border-image-width", + "-o-border-image-width", + "border-image-width", + "-webkit-border-image-outset", + "-moz-border-image-outset", + "-o-border-image-outset", + "border-image-outset", + "-webkit-border-image-repeat", + "-moz-border-image-repeat", + "-o-border-image-repeat", + "border-image-repeat", + "outline", + "outline-width", + "outline-style", + "outline-color", + "outline-offset", + "background", + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader", + "background-color", + "background-image", + "background-repeat", + "background-attachment", + "background-position", + "background-position-x", + "-ms-background-position-x", + "background-position-y", + "-ms-background-position-y", + "-webkit-background-clip", + "-moz-background-clip", + "background-clip", + "background-origin", + "-webkit-background-size", + "-moz-background-size", + "-o-background-size", + "background-size", + "box-decoration-break", + "-webkit-box-shadow", + "-moz-box-shadow", + "box-shadow", + "filter:progid:DXImageTransform.Microsoft.gradient", + "-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient", + "text-shadow" + ] + ] +}