contexts = array(); $this->allExtendsStack = array(array()); parent::__construct(); } /** * @param Less_Tree_Ruleset $root */ public function run($root){ $root = $this->visitObj($root); $root->allExtends =& $this->allExtendsStack[0]; return $root; } public function visitRule($ruleNode, &$visitDeeper ){ $visitDeeper = false; } public function visitMixinDefinition( $mixinDefinitionNode, &$visitDeeper ){ $visitDeeper = false; } public function visitRuleset($rulesetNode){ if( $rulesetNode->root ){ return; } $allSelectorsExtendList = array(); // get &:extend(.a); rules which apply to all selectors in this ruleset if( $rulesetNode->rules ){ foreach($rulesetNode->rules as $rule){ if( $rule instanceof Less_Tree_Extend ){ $allSelectorsExtendList[] = $rule; $rulesetNode->extendOnEveryPath = true; } } } // now find every selector and apply the extends that apply to all extends // and the ones which apply to an individual extend foreach($rulesetNode->paths as $selectorPath){ $selector = end($selectorPath); //$selectorPath[ count($selectorPath)-1]; $j = 0; foreach($selector->extendList as $extend){ $this->allExtendsStackPush($rulesetNode, $selectorPath, $extend, $j); } foreach($allSelectorsExtendList as $extend){ $this->allExtendsStackPush($rulesetNode, $selectorPath, $extend, $j); } } $this->contexts[] = $rulesetNode->selectors; } public function allExtendsStackPush($rulesetNode, $selectorPath, $extend, &$j){ $this->foundExtends = true; $extend = clone $extend; $extend->findSelfSelectors( $selectorPath ); $extend->ruleset = $rulesetNode; if( $j === 0 ){ $extend->firstExtendOnThisSelectorPath = true; } $end_key = count($this->allExtendsStack)-1; $this->allExtendsStack[$end_key][] = $extend; $j++; } public function visitRulesetOut( $rulesetNode ){ if( !is_object($rulesetNode) || !$rulesetNode->root ){ array_pop($this->contexts); } } public function visitMedia( $mediaNode ){ $mediaNode->allExtends = array(); $this->allExtendsStack[] =& $mediaNode->allExtends; } public function visitMediaOut(){ array_pop($this->allExtendsStack); } public function visitDirective( $directiveNode ){ $directiveNode->allExtends = array(); $this->allExtendsStack[] =& $directiveNode->allExtends; } public function visitDirectiveOut(){ array_pop($this->allExtendsStack); } }