diff --git a/lib/replace/Value.js b/lib/replace/Value.js index bdb7ae7f..d57ef581 100644 --- a/lib/replace/Value.js +++ b/lib/replace/Value.js @@ -2,7 +2,9 @@ var resolveName = require('css-tree').property; var handlers = { 'font': require('./property/font.js'), 'font-weight': require('./property/font-weight.js'), - 'background': require('./property/background.js') + 'background': require('./property/background.js'), + 'border': require('./property/border.js'), + 'outline': require('./property/border.js') }; module.exports = function compressValue(node) { diff --git a/lib/replace/property/border.js b/lib/replace/property/border.js new file mode 100644 index 00000000..09a32c3a --- /dev/null +++ b/lib/replace/property/border.js @@ -0,0 +1,31 @@ +function removeItemAndRedundantWhiteSpace(list, item) { + var prev = item.prev; + var next = item.next; + + if (next !== null) { + if (next.data.type === 'WhiteSpace' && (prev === null || prev.data.type === 'WhiteSpace')) { + list.remove(next); + } + } else if (prev !== null && prev.data.type === 'WhiteSpace') { + list.remove(prev); + } + + list.remove(item); +} + +module.exports = function compressBorder(node) { + node.children.each(function(node, item, list) { + if (node.type === 'Identifier' && node.name.toLowerCase() === 'none') { + if (list.head === list.tail) { + // replace `none` for zero when `none` is a single term + item.data = { + type: 'Number', + loc: node.loc, + value: '0' + }; + } else { + removeItemAndRedundantWhiteSpace(list, item); + } + } + }); +}; diff --git a/test/fixture/compress/disjoin/1.css b/test/fixture/compress/disjoin/1.css index 371b8559..9f1a01b6 100644 --- a/test/fixture/compress/disjoin/1.css +++ b/test/fixture/compress/disjoin/1.css @@ -32,5 +32,5 @@ b { /*! better solution - a,b,foo{color:red;width:200px}foo{border:none}b,foo{color:#00f;height:50px}@media (min-width:400px){a,b,foo{color:red;width:200px}foo{border:none}b,foo{color:#00f;height:50px}} + a,b,foo{color:red;width:200px}foo{border:0}b,foo{color:#00f;height:50px}@media (min-width:400px){a,b,foo{color:red;width:200px}foo{border:0}b,foo{color:#00f;height:50px}} */ diff --git a/test/fixture/compress/disjoin/1.min.css b/test/fixture/compress/disjoin/1.min.css index e6603171..1bb0ca27 100644 --- a/test/fixture/compress/disjoin/1.min.css +++ b/test/fixture/compress/disjoin/1.min.css @@ -1,5 +1,5 @@ -a{color:red;width:200px}foo{border:none}b,foo{color:#00f;width:200px;height:50px}@media (min-width:400px){a{color:red;width:200px}foo{border:none}b,foo{color:#00f;width:200px;height:50px}} +a{color:red;width:200px}foo{border:0}b,foo{color:#00f;width:200px;height:50px}@media (min-width:400px){a{color:red;width:200px}foo{border:0}b,foo{color:#00f;width:200px;height:50px}} /*! better solution - a,b,foo{color:red;width:200px}foo{border:none}b,foo{color:#00f;height:50px}@media (min-width:400px){a,b,foo{color:red;width:200px}foo{border:none}b,foo{color:#00f;height:50px}} + a,b,foo{color:red;width:200px}foo{border:0}b,foo{color:#00f;height:50px}@media (min-width:400px){a,b,foo{color:red;width:200px}foo{border:0}b,foo{color:#00f;height:50px}} */ diff --git a/test/fixture/compress/issue/39-5.min.css b/test/fixture/compress/issue/39-5.min.css index 4f8a30e0..d840b9de 100644 --- a/test/fixture/compress/issue/39-5.min.css +++ b/test/fixture/compress/issue/39-5.min.css @@ -1 +1 @@ -a,b:test{color:red;border:none} \ No newline at end of file +a,b:test{color:red;border:0} diff --git a/test/fixture/compress/issue/39-6.min.css b/test/fixture/compress/issue/39-6.min.css index 085c4bb5..5b482fed 100644 --- a/test/fixture/compress/issue/39-6.min.css +++ b/test/fixture/compress/issue/39-6.min.css @@ -1 +1 @@ -:test{color:#00f;border:none}a{color:green} +:test{color:#00f;border:0}a{color:green} diff --git a/test/fixture/compress/none-to-zero.css b/test/fixture/compress/none-to-zero.css new file mode 100644 index 00000000..c1c8a36f --- /dev/null +++ b/test/fixture/compress/none-to-zero.css @@ -0,0 +1,11 @@ +.o { outline: 1px none red } +.o-none { outline: none } +.o-none-red { outline: none red } +.o-red-none { outline: red none } +.o-reverse { outline: none 1px red } + +.b { border: 1px none red } +.b-none { border: none } +.b-none-red { border: none red } +.b-red-none { border: red none } +.b-reverse { border: none 1px red } diff --git a/test/fixture/compress/none-to-zero.min.css b/test/fixture/compress/none-to-zero.min.css new file mode 100644 index 00000000..e41c1ab1 --- /dev/null +++ b/test/fixture/compress/none-to-zero.min.css @@ -0,0 +1 @@ +.o{outline:1px red}.o-none{outline:0}.o-none-red,.o-red-none{outline:red}.o-reverse{outline:1px red}.b{border:1px red}.b-none{border:0}.b-none-red,.b-red-none{border:red}.b-reverse{border:1px red}