You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.5 KiB
72 lines
1.5 KiB
<?php
|
|
|
|
/**
|
|
* Condition
|
|
*
|
|
* @package Less
|
|
* @subpackage tree
|
|
*/
|
|
class Less_Tree_Condition extends Less_Tree{
|
|
|
|
public $op;
|
|
public $lvalue;
|
|
public $rvalue;
|
|
public $index;
|
|
public $negate;
|
|
public $type = 'Condition';
|
|
|
|
public function __construct($op, $l, $r, $i = 0, $negate = false) {
|
|
$this->op = trim($op);
|
|
$this->lvalue = $l;
|
|
$this->rvalue = $r;
|
|
$this->index = $i;
|
|
$this->negate = $negate;
|
|
}
|
|
|
|
public function accept($visitor){
|
|
$this->lvalue = $visitor->visitObj( $this->lvalue );
|
|
$this->rvalue = $visitor->visitObj( $this->rvalue );
|
|
}
|
|
|
|
public function compile($env) {
|
|
$a = $this->lvalue->compile($env);
|
|
$b = $this->rvalue->compile($env);
|
|
|
|
switch( $this->op ){
|
|
case 'and':
|
|
$result = $a && $b;
|
|
break;
|
|
|
|
case 'or':
|
|
$result = $a || $b;
|
|
break;
|
|
|
|
default:
|
|
if( Less_Parser::is_method($a, 'compare') ){
|
|
$result = $a->compare($b);
|
|
}elseif( Less_Parser::is_method($b, 'compare') ){
|
|
$result = $b->compare($a);
|
|
}else{
|
|
throw new Less_Exception_Compiler('Unable to perform comparison', null, $this->index);
|
|
}
|
|
|
|
switch ($result) {
|
|
case -1:
|
|
$result = $this->op === '<' || $this->op === '=<' || $this->op === '<=';
|
|
break;
|
|
|
|
case 0:
|
|
$result = $this->op === '=' || $this->op === '>=' || $this->op === '=<' || $this->op === '<=';
|
|
break;
|
|
|
|
case 1:
|
|
$result = $this->op === '>' || $this->op === '>=';
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return $this->negate ? !$result : $result;
|
|
}
|
|
|
|
}
|
|
|