var utils = require('./utils.js'); var walkRules = require('../../utils/walk.js').rules; function processRuleset(node, item, list) { var selectors = node.selector.selectors; var declarations = node.block.declarations; list.prevUntil(item.prev, function(prev) { // skip non-ruleset node if safe if (prev.type !== 'Ruleset') { return utils.unsafeToSkipNode.call(selectors, prev); } var prevSelectors = prev.selector.selectors; var prevDeclarations = prev.block.declarations; // try to join rulesets with equal pseudo signature if (node.pseudoSignature === prev.pseudoSignature) { // try to join by selectors if (utils.isEqualLists(prevSelectors, selectors)) { prevDeclarations.appendList(declarations); list.remove(item); return true; } // try to join by declarations if (utils.isEqualDeclarations(declarations, prevDeclarations)) { utils.addSelectors(prevSelectors, selectors); list.remove(item); return true; } } // go to prev ruleset if has no selector similarities return utils.hasSimilarSelectors(selectors, prevSelectors); }); }; // NOTE: direction should be left to right, since rulesets merge to left // ruleset. When direction right to left unmerged rulesets may prevent lookup // TODO: remove initial merge module.exports = function initialMergeRuleset(ast) { walkRules(ast, function(node, item, list) { if (node.type === 'Ruleset') { processRuleset(node, item, list); } }); };