You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							47 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
	
	
							47 lines
						
					
					
						
							1.6 KiB
						
					
					
				var walk = require('css-tree').walk; | 
						|
var utils = require('./utils'); | 
						|
 | 
						|
function processRule(node, item, list) { | 
						|
    var selectors = node.prelude.children; | 
						|
    var declarations = node.block.children; | 
						|
 | 
						|
    list.prevUntil(item.prev, function(prev) { | 
						|
        // skip non-ruleset node if safe | 
						|
        if (prev.type !== 'Rule') { | 
						|
            return utils.unsafeToSkipNode.call(selectors, prev); | 
						|
        } | 
						|
 | 
						|
        var prevSelectors = prev.prelude.children; | 
						|
        var prevDeclarations = prev.block.children; | 
						|
 | 
						|
        // try to join rulesets with equal pseudo signature | 
						|
        if (node.pseudoSignature === prev.pseudoSignature) { | 
						|
            // try to join by selectors | 
						|
            if (utils.isEqualSelectors(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 initialMergeRule(ast) { | 
						|
    walk(ast, { | 
						|
        visit: 'Rule', | 
						|
        enter: processRule | 
						|
    }); | 
						|
};
 | 
						|
 |