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.
		
		
		
		
			
				
					48 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					48 lines
				
				1.6 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								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
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								};
							 |