123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- <?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 );
- }
- }
|