Ejemplo n.º 1
0
 /**
  * Operates with the dimension. In an operation between two dimensions,
  * we default to the first Dimension's unit,
  * so `1px + 2` will yield `3px`.
  *
  * @param ILess_Environment $env
  * @param string $op
  * @param ILess_Node_Dimension $other
  * @return ILess_Node_Dimension
  * @throws ILess_CompilerException
  */
 public function operate(ILess_Environment $env, $op, ILess_Node_Dimension $other)
 {
     $value = ILess_Math::operate($op, $this->value, $other->value);
     $unit = clone $this->unit;
     if ($op === '+' || $op === '-') {
         if (!count($unit->numerator) && !count($unit->denominator)) {
             $unit->numerator = $other->unit->numerator;
             $unit->denominator = $other->unit->denominator;
         } elseif (!count($other->unit->numerator) && !count($other->unit->denominator)) {
             // do nothing
         } else {
             $other = $other->convertTo($this->unit->usedUnits());
             if ($env->strictUnits && $other->unit->toString() !== $unit->toString()) {
                 throw new ILess_Exception_Compiler(sprintf('Incompatible units. Change the units or use the unit function. Bad units: \'%s\' and \'%s\'.', $unit->toString(), $other->unit->toString()));
             }
             $value = ILess_Math::operate($op, $this->value, $other->value);
         }
     } elseif ($op === '*') {
         $unit->numerator = array_merge($unit->numerator, $other->unit->numerator);
         $unit->denominator = array_merge($unit->denominator, $other->unit->denominator);
         sort($unit->numerator);
         sort($unit->denominator);
         $unit->cancel();
     } elseif ($op === '/') {
         $unit->numerator = array_merge($unit->numerator, $other->unit->denominator);
         $unit->denominator = array_merge($unit->denominator, $other->unit->numerator);
         sort($unit->numerator);
         sort($unit->denominator);
         $unit->cancel();
     }
     return new ILess_Node_Dimension($value, $unit);
 }
Ejemplo n.º 2
0
 /**
  * Compares two units
  *
  * @param ILess_Node_DimensionUnit $other
  * @return integer| 0 or -1
  */
 public function compare(ILess_Node_DimensionUnit $other)
 {
     return $this->is($other->toString()) ? 0 : -1;
 }