UNPKG

node-less

Version:

Less Compiler For Node

74 lines (69 loc) 2.9 kB
(function (module) { var visitor = require('./visitor.js'), Extend = require('./Extend.js'); var extendFinderVisitor = function() { this._visitor = new visitor(this); this.contexts = []; this.allExtendsStack = [[]]; }; extendFinderVisitor.prototype = { run: function (root) { root = this._visitor.visit(root); root.allExtends = this.allExtendsStack[0]; return root; }, visitRule: function (ruleNode, visitArgs) { visitArgs.visitDeeper = false; }, visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { visitArgs.visitDeeper = false; }, visitRuleset: function (rulesetNode, visitArgs) { if (rulesetNode.root) { return; } var i, j, extend, allSelectorsExtendList = [], extendList; for(i = 0; i < rulesetNode.rules.length; i++) { if (rulesetNode.rules[i] instanceof Extend) { allSelectorsExtendList.push(rulesetNode.rules[i]); } } for(i = 0; i < rulesetNode.paths.length; i++) { var selectorPath = rulesetNode.paths[i], selector = selectorPath[selectorPath.length-1]; extendList = selector.extendList.slice(0).concat(allSelectorsExtendList).map(function(allSelectorsExtend) { return allSelectorsExtend.clone(); }); for(j = 0; j < extendList.length; j++) { this.foundExtends = true; extend = extendList[j]; extend.findSelfSelectors(selectorPath); extend.ruleset = rulesetNode; if (j === 0) { extend.firstExtendOnThisSelectorPath = true; } this.allExtendsStack[this.allExtendsStack.length-1].push(extend); } } this.contexts.push(rulesetNode.selectors); }, visitRulesetOut: function (rulesetNode) { if (!rulesetNode.root) { this.contexts.length = this.contexts.length - 1; } }, visitMedia: function (mediaNode, visitArgs) { mediaNode.allExtends = []; this.allExtendsStack.push(mediaNode.allExtends); }, visitMediaOut: function (mediaNode) { this.allExtendsStack.length = this.allExtendsStack.length - 1; }, visitDirective: function (directiveNode, visitArgs) { directiveNode.allExtends = []; this.allExtendsStack.push(directiveNode.allExtends); }, visitDirectiveOut: function (directiveNode) { this.allExtendsStack.length = this.allExtendsStack.length - 1; } }; module.exports = extendFinderVisitor; })(module);