123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- <?php
- /**
- * Extend Finder Visitor
- *
- * @package Less
- * @subpackage visitor
- */
- class Less_Visitor_extendFinder extends Less_Visitor{
- public $contexts = array();
- public $allExtendsStack;
- public $foundExtends;
- public function __construct(){
- $this->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);
- }
- }
|