cssnano
Version:
A modular minifier, built on top of the PostCSS ecosystem.
58 lines (51 loc) • 1.88 kB
JavaScript
;
var TRBLOptimiser = require('./trblCache');
var collapsableTRBLProps = [
'margin',
'padding',
'border-color',
'border-width',
'border-style',
];
function minimiseWhitespace (rule) {
rule.before = rule.between = rule.after = '';
rule.semicolon = false;
}
module.exports = function () {
return function (css) {
css.eachDecl(function (declaration) {
// Ensure that !important values do not have any excess whitespace
if (declaration.important) {
declaration._important = '!important';
}
// Trim unnecessary space around e.g. 12px / 18px
declaration.value = declaration.value.replace(/\s*(\/)\s*/, '$1');
if (~[
'outline',
'outline-left',
'outline-right',
'outline-top',
'outline-bottom'
].indexOf(declaration.prop)) {
declaration.value = declaration.value.replace('none', '0');
}
if (~collapsableTRBLProps.indexOf(declaration.prop)) {
var opt = new TRBLOptimiser();
opt.importShorthand(declaration.value);
declaration.value = '' + opt;
}
// Remove whitespaces around ie 9 hack
declaration.value = declaration.value.replace(/\s*(\\9)\s*/, '$1');
// Remove extra semicolons and whitespace before the declaration
if (declaration.before) {
declaration.before = declaration.before.replace(/[;\s]/g, '');
}
declaration.between = ':';
declaration.semicolon = false;
});
css.eachRule(minimiseWhitespace);
css.eachAtRule(minimiseWhitespace);
// Remove final newline
css.after = '';
};
};