123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- <?php
- class Less_Tree_Mixin_Definition extends Less_Tree_Ruleset {
- public $name;
- public $selectors;
- public $params;
- public $arity = 0;
- public $rules;
- public $lookups = array();
- public $required = 0;
- public $frames = array();
- public $condition;
- public $variadic;
- public $type = 'MixinDefinition';
- // less.js : /lib/less/tree/mixin.js : tree.mixin.Definition
- public function __construct( $name, $params, $rules, $condition, $variadic = false, $frames = array() ) {
- $this->name = $name;
- $this->selectors = array( new Less_Tree_Selector( array( new Less_Tree_Element( null, $name ) ) ) );
- $this->params = $params;
- $this->condition = $condition;
- $this->variadic = $variadic;
- $this->rules = $rules;
- if ( $params ) {
- $this->arity = count( $params );
- foreach ( $params as $p ) {
- if ( !isset( $p['name'] ) || ( $p['name'] && !isset( $p['value'] ) ) ) {
- $this->required++;
- }
- }
- }
- $this->frames = $frames;
- $this->SetRulesetIndex();
- }
- // function accept( $visitor ){
- // $this->params = $visitor->visit($this->params);
- // $this->rules = $visitor->visit($this->rules);
- // $this->condition = $visitor->visit($this->condition);
- //}
- public function toCSS() {
- return '';
- }
- // less.js : /lib/less/tree/mixin.js : tree.mixin.Definition.evalParams
- public function compileParams( $env, $mixinFrames, $args = array(), &$evaldArguments = array() ) {
- $frame = new Less_Tree_Ruleset( null, array() );
- $params = $this->params;
- $mixinEnv = null;
- $argsLength = 0;
- if ( $args ) {
- $argsLength = count( $args );
- for ( $i = 0; $i < $argsLength; $i++ ) {
- $arg = $args[$i];
- if ( $arg && $arg['name'] ) {
- $isNamedFound = false;
- foreach ( $params as $j => $param ) {
- if ( !isset( $evaldArguments[$j] ) && $arg['name'] === $params[$j]['name'] ) {
- $evaldArguments[$j] = $arg['value']->compile( $env );
- array_unshift( $frame->rules, new Less_Tree_Rule( $arg['name'], $arg['value']->compile( $env ) ) );
- $isNamedFound = true;
- break;
- }
- }
- if ( $isNamedFound ) {
- array_splice( $args, $i, 1 );
- $i--;
- $argsLength--;
- continue;
- } else {
- throw new Less_Exception_Compiler( "Named argument for " . $this->name .' '.$args[$i]['name'] . ' not found' );
- }
- }
- }
- }
- $argIndex = 0;
- foreach ( $params as $i => $param ) {
- if ( isset( $evaldArguments[$i] ) ) { continue;
- }
- $arg = null;
- if ( isset( $args[$argIndex] ) ) {
- $arg = $args[$argIndex];
- }
- if ( isset( $param['name'] ) && $param['name'] ) {
- if ( isset( $param['variadic'] ) ) {
- $varargs = array();
- for ( $j = $argIndex; $j < $argsLength; $j++ ) {
- $varargs[] = $args[$j]['value']->compile( $env );
- }
- $expression = new Less_Tree_Expression( $varargs );
- array_unshift( $frame->rules, new Less_Tree_Rule( $param['name'], $expression->compile( $env ) ) );
- } else {
- $val = ( $arg && $arg['value'] ) ? $arg['value'] : false;
- if ( $val ) {
- $val = $val->compile( $env );
- } else if ( isset( $param['value'] ) ) {
- if ( !$mixinEnv ) {
- $mixinEnv = new Less_Environment();
- $mixinEnv->frames = array_merge( array( $frame ), $mixinFrames );
- }
- $val = $param['value']->compile( $mixinEnv );
- $frame->resetCache();
- } else {
- throw new Less_Exception_Compiler( "Wrong number of arguments for " . $this->name . " (" . $argsLength . ' for ' . $this->arity . ")" );
- }
- array_unshift( $frame->rules, new Less_Tree_Rule( $param['name'], $val ) );
- $evaldArguments[$i] = $val;
- }
- }
- if ( isset( $param['variadic'] ) && $args ) {
- for ( $j = $argIndex; $j < $argsLength; $j++ ) {
- $evaldArguments[$j] = $args[$j]['value']->compile( $env );
- }
- }
- $argIndex++;
- }
- ksort( $evaldArguments );
- $evaldArguments = array_values( $evaldArguments );
- return $frame;
- }
- public function compile( $env ) {
- if ( $this->frames ) {
- return new Less_Tree_Mixin_Definition( $this->name, $this->params, $this->rules, $this->condition, $this->variadic, $this->frames );
- }
- return new Less_Tree_Mixin_Definition( $this->name, $this->params, $this->rules, $this->condition, $this->variadic, $env->frames );
- }
- public function evalCall( $env, $args = NULL, $important = NULL ) {
- Less_Environment::$mixin_stack++;
- $_arguments = array();
- if ( $this->frames ) {
- $mixinFrames = array_merge( $this->frames, $env->frames );
- } else {
- $mixinFrames = $env->frames;
- }
- $frame = $this->compileParams( $env, $mixinFrames, $args, $_arguments );
- $ex = new Less_Tree_Expression( $_arguments );
- array_unshift( $frame->rules, new Less_Tree_Rule( '@arguments', $ex->compile( $env ) ) );
- $ruleset = new Less_Tree_Ruleset( null, $this->rules );
- $ruleset->originalRuleset = $this->ruleset_id;
- $ruleSetEnv = new Less_Environment();
- $ruleSetEnv->frames = array_merge( array( $this, $frame ), $mixinFrames );
- $ruleset = $ruleset->compile( $ruleSetEnv );
- if ( $important ) {
- $ruleset = $ruleset->makeImportant();
- }
- Less_Environment::$mixin_stack--;
- return $ruleset;
- }
- public function matchCondition( $args, $env ) {
- if ( !$this->condition ) {
- return true;
- }
- // set array to prevent error on array_merge
- if ( !is_array( $this->frames ) ) {
- $this->frames = array();
- }
- $frame = $this->compileParams( $env, array_merge( $this->frames, $env->frames ), $args );
- $compile_env = new Less_Environment();
- $compile_env->frames = array_merge(
- array( $frame ), // the parameter variables
- $this->frames, // the parent namespace/mixin frames
- $env->frames // the current environment frames
- );
- $compile_env->functions = $env->functions;
- return (bool)$this->condition->compile( $compile_env );
- }
- public function matchArgs( $args, $env = NULL ) {
- $argsLength = count( $args );
- if ( !$this->variadic ) {
- if ( $argsLength < $this->required ) {
- return false;
- }
- if ( $argsLength > count( $this->params ) ) {
- return false;
- }
- } else {
- if ( $argsLength < ( $this->required - 1 ) ) {
- return false;
- }
- }
- $len = min( $argsLength, $this->arity );
- for ( $i = 0; $i < $len; $i++ ) {
- if ( !isset( $this->params[$i]['name'] ) && !isset( $this->params[$i]['variadic'] ) ) {
- if ( $args[$i]['value']->compile( $env )->toCSS() != $this->params[$i]['value']->compile( $env )->toCSS() ) {
- return false;
- }
- }
- }
- return true;
- }
- }
|