-var CleanUp = require('./clean-up');
+var cleanUpSelectors = require('./clean-up').selectors;
+var cleanUpBlock = require('./clean-up').block;
+var cleanUpAtRule = require('./clean-up').atRule;
var Splitter = require('../utils/splitter');
var RGB = require('../colors/rgb');
var FONT_NUMERAL_WEIGHTS = ['100', '200', '300', '400', '500', '600', '700', '800', '900'];
var FONT_NAME_WEIGHTS = ['normal', 'bold', 'bolder', 'lighter'];
-function SimpleOptimizer(options) {
- this.options = options;
-
- var units = ['px', 'em', 'ex', 'cm', 'mm', 'in', 'pt', 'pc', '%'];
- var otherUnits = ['ch', 'rem', 'vh', 'vm', 'vmax', 'vmin', 'vw'];
-
- otherUnits.forEach(function (unit) {
- if (options.compatibility.units[unit])
- units.push(unit);
- });
-
- options.unitsRegexp = new RegExp('(^|\\s|\\(|,)0(?:' + units.join('|') + ')(\\W|$)', 'g');
-
- options.precision = {};
- options.precision.value = options.roundingPrecision === undefined ?
- DEFAULT_ROUNDING_PRECISION :
- options.roundingPrecision;
- options.precision.multiplier = Math.pow(10, options.precision.value);
- options.precision.regexp = new RegExp('(\\d*\\.\\d{' + (options.precision.value + 1) + ',})px', 'g');
-}
-
var valueMinifiers = {
'background': function (value, index, total) {
return index == 1 && total == 2 && (value == 'none' || value == 'transparent') ? '0 0' : value;
}
}
-SimpleOptimizer.prototype.optimize = function (tokens) {
- var self = this;
+function cleanupCharsets(tokens) {
var hasCharset = false;
- var options = this.options;
- var ie7Hack = options.compatibility.selectors.ie7Hack;
- var adjacentSpace = options.compatibility.selectors.adjacentSpace;
- var spaceAfterClosingBrace = options.compatibility.properties.spaceAfterClosingBrace;
- function _cleanupCharsets(tokens) {
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
-
- if (token[0] != 'at-rule')
- continue;
-
- if (CHARSET_REGEXP.test(token[1][0])) {
- if (hasCharset || token[1][0].indexOf(CHARSET_TOKEN) == -1) {
- tokens.splice(i, 1);
- i--;
- l--;
- } else {
- hasCharset = true;
- tokens.splice(i, 1);
- tokens.unshift(['at-rule', [token[1][0].replace(CHARSET_REGEXP, CHARSET_TOKEN)]]);
- }
- }
+ for (var i = 0, l = tokens.length; i < l; i++) {
+ var token = tokens[i];
+
+ if (token[0] != 'at-rule')
+ continue;
+
+ if (!CHARSET_REGEXP.test(token[1][0]))
+ continue;
+
+ if (hasCharset || token[1][0].indexOf(CHARSET_TOKEN) == -1) {
+ tokens.splice(i, 1);
+ i--;
+ l--;
+ } else {
+ hasCharset = true;
+ tokens.splice(i, 1);
+ tokens.unshift(['at-rule', [token[1][0].replace(CHARSET_REGEXP, CHARSET_TOKEN)]]);
}
}
+}
- function _optimize(tokens) {
- var mayHaveCharset = false;
-
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
-
- switch (token[0]) {
- case 'selector':
- token[1] = CleanUp.selectors(token[1], !ie7Hack, adjacentSpace);
- optimizeBody(token[2], self.options);
- break;
- case 'block':
- CleanUp.block(token[1], spaceAfterClosingBrace);
- _optimize(token[2]);
- break;
- case 'flat-block':
- CleanUp.block(token[1], spaceAfterClosingBrace);
- optimizeBody(token[2], self.options);
- break;
- case 'at-rule':
- CleanUp.atRule(token[1]);
- mayHaveCharset = true;
- }
+function buildUnitRegexp(options) {
+ var units = ['px', 'em', 'ex', 'cm', 'mm', 'in', 'pt', 'pc', '%'];
+ var otherUnits = ['ch', 'rem', 'vh', 'vm', 'vmax', 'vmin', 'vw'];
- if (token[1].length === 0 || (token[2] && token[2].length === 0)) {
- tokens.splice(i, 1);
- i--;
- l--;
- }
+ otherUnits.forEach(function (unit) {
+ if (options.compatibility.units[unit])
+ units.push(unit);
+ });
+
+ return new RegExp('(^|\\s|\\(|,)0(?:' + units.join('|') + ')(\\W|$)', 'g');
+}
+
+function buildPrecision(options) {
+ var precision = {};
+
+ precision.value = options.roundingPrecision === undefined ?
+ DEFAULT_ROUNDING_PRECISION :
+ options.roundingPrecision;
+ precision.multiplier = Math.pow(10, precision.value);
+ precision.regexp = new RegExp('(\\d*\\.\\d{' + (precision.value + 1) + ',})px', 'g');
+
+ return precision;
+}
+
+function optimize(tokens, options) {
+ var ie7Hack = options.compatibility.selectors.ie7Hack;
+ var adjacentSpace = options.compatibility.selectors.adjacentSpace;
+ var spaceAfterClosingBrace = options.compatibility.properties.spaceAfterClosingBrace;
+ var mayHaveCharset = false;
+
+ options.unitsRegexp = buildUnitRegexp(options);
+ options.precision = buildPrecision(options);
+
+ for (var i = 0, l = tokens.length; i < l; i++) {
+ var token = tokens[i];
+
+ switch (token[0]) {
+ case 'selector':
+ token[1] = cleanUpSelectors(token[1], !ie7Hack, adjacentSpace);
+ optimizeBody(token[2], options);
+ break;
+ case 'block':
+ cleanUpBlock(token[1], spaceAfterClosingBrace);
+ optimize(token[2], options);
+ break;
+ case 'flat-block':
+ cleanUpBlock(token[1], spaceAfterClosingBrace);
+ optimizeBody(token[2], options);
+ break;
+ case 'at-rule':
+ cleanUpAtRule(token[1]);
+ mayHaveCharset = true;
}
- if (mayHaveCharset)
- _cleanupCharsets(tokens);
+ if (token[1].length === 0 || (token[2] && token[2].length === 0)) {
+ tokens.splice(i, 1);
+ i--;
+ l--;
+ }
}
- _optimize(tokens);
-};
+ if (mayHaveCharset)
+ cleanupCharsets(tokens);
+}
-module.exports = SimpleOptimizer;
+module.exports = optimize;