Merge branch 'MDL-46588-27' of git://github.com/jleyva/moodle into MOODLE_27_STABLE
[moodle.git] / lib / lessphp / Visitor / extendFinder.php
blob28be9ae93ffdceb9a1670e5fedc0df80f563f0ba
1 <?php
3 /**
4 * Extend Finder Visitor
6 * @package Less
7 * @subpackage visitor
8 */
9 class Less_Visitor_extendFinder extends Less_Visitor{
11 public $contexts = array();
12 public $allExtendsStack;
13 public $foundExtends;
15 function __construct(){
16 $this->contexts = array();
17 $this->allExtendsStack = array(array());
18 parent::__construct();
21 /**
22 * @param Less_Tree_Ruleset $root
24 function run($root){
25 $root = $this->visitObj($root);
26 $root->allExtends =& $this->allExtendsStack[0];
27 return $root;
30 function visitRule($ruleNode, &$visitDeeper ){
31 $visitDeeper = false;
34 function visitMixinDefinition( $mixinDefinitionNode, &$visitDeeper ){
35 $visitDeeper = false;
38 function visitRuleset($rulesetNode){
40 if( $rulesetNode->root ){
41 return;
44 $allSelectorsExtendList = array();
46 // get &:extend(.a); rules which apply to all selectors in this ruleset
47 if( $rulesetNode->rules ){
48 foreach($rulesetNode->rules as $rule){
49 if( $rule instanceof Less_Tree_Extend ){
50 $allSelectorsExtendList[] = $rule;
51 $rulesetNode->extendOnEveryPath = true;
57 // now find every selector and apply the extends that apply to all extends
58 // and the ones which apply to an individual extend
59 foreach($rulesetNode->paths as $selectorPath){
60 $selector = end($selectorPath); //$selectorPath[ count($selectorPath)-1];
62 $j = 0;
63 foreach($selector->extendList as $extend){
64 $this->allExtendsStackPush($rulesetNode, $selectorPath, $extend, $j);
66 foreach($allSelectorsExtendList as $extend){
67 $this->allExtendsStackPush($rulesetNode, $selectorPath, $extend, $j);
71 $this->contexts[] = $rulesetNode->selectors;
74 function allExtendsStackPush($rulesetNode, $selectorPath, $extend, &$j){
75 $this->foundExtends = true;
76 $extend = clone $extend;
77 $extend->findSelfSelectors( $selectorPath );
78 $extend->ruleset = $rulesetNode;
79 if( $j === 0 ){
80 $extend->firstExtendOnThisSelectorPath = true;
83 $end_key = count($this->allExtendsStack)-1;
84 $this->allExtendsStack[$end_key][] = $extend;
85 $j++;
89 function visitRulesetOut( $rulesetNode ){
90 if( !is_object($rulesetNode) || !$rulesetNode->root ){
91 array_pop($this->contexts);
95 function visitMedia( $mediaNode ){
96 $mediaNode->allExtends = array();
97 $this->allExtendsStack[] =& $mediaNode->allExtends;
100 function visitMediaOut(){
101 array_pop($this->allExtendsStack);
104 function visitDirective( $directiveNode ){
105 $directiveNode->allExtends = array();
106 $this->allExtendsStack[] =& $directiveNode->allExtends;
109 function visitDirectiveOut(){
110 array_pop($this->allExtendsStack);