1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
<?php
/**
* @private
*/
class Less_Visitor_extendFinder extends Less_Visitor {
public $contexts = [];
public $allExtendsStack;
public $foundExtends;
public function __construct() {
$this->contexts = [];
$this->allExtendsStack = [ [] ];
parent::__construct();
}
/**
* @param Less_Tree_Ruleset $root
*/
public function run( $root ) {
$root = $this->visitObj( $root );
$root->allExtends =& $this->allExtendsStack[0];
return $root;
}
public function visitDeclaration( $declNode, &$visitDeeper ) {
$visitDeeper = false;
}
public function visitMixinDefinition( $mixinDefinitionNode, &$visitDeeper ) {
$visitDeeper = false;
}
public function visitRuleset( $rulesetNode ) {
if ( $rulesetNode->root ) {
return;
}
$allSelectorsExtendList = [];
// 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, Less_Tree_Extend $extend, &$j ) {
$this->foundExtends = true;
$extend = $extend->clone();
$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 = [];
$this->allExtendsStack[] =& $mediaNode->allExtends;
}
public function visitMediaOut() {
array_pop( $this->allExtendsStack );
}
public function visitAtRule( $atRuleNode ) {
$atRuleNode->allExtends = [];
$this->allExtendsStack[] =& $atRuleNode->allExtends;
}
public function visitAtRuleOut() {
array_pop( $this->allExtendsStack );
}
}
|