/** * 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); }
/** * 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; }