%PDF- %PDF-
| Direktori : /home/q/g/b/qgbqkvz/www/wp-content/plugins/wp-scss/scssphp/src/Value/ |
| Current File : /home/q/g/b/qgbqkvz/www/wp-content/plugins/wp-scss/scssphp/src/Value/SingleUnitSassNumber.php |
<?php
/**
* SCSSPHP
*
* @copyright 2012-2020 Leaf Corcoran
*
* @license http://opensource.org/licenses/MIT MIT
*
* @link http://scssphp.github.io/scssphp
*/
namespace ScssPhp\ScssPhp\Value;
use ScssPhp\ScssPhp\Util\NumberUtil;
/**
* A specialized subclass of {@see SassNumber} for numbers that have exactly one numerator unit.
*
* @internal
*/
final class SingleUnitSassNumber extends SassNumber
{
private const KNOWN_COMPATIBILITIES_BY_UNIT = [
// length
'em' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'ex' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'ch' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'rem' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'vw' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'vh' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'vmin' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'vmax' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'cm' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'mm' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'q' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'in' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'pc' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'pt' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
'px' => ['em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'cm', 'mm', 'q', 'in', 'pc', 'pt', 'px'],
// angle
'deg' => ['deg', 'grad', 'rad', 'turn'],
'grad' => ['deg', 'grad', 'rad', 'turn'],
'rad' => ['deg', 'grad', 'rad', 'turn'],
'turn' => ['deg', 'grad', 'rad', 'turn'],
// time
's' => ['s', 'ms'],
'ms' => ['s', 'ms'],
// frequency
'hz' => ['hz', 'khz'],
'khz' => ['hz', 'khz'],
// pixel density
'dpi' => ['dpi', 'dpcm', 'dppx'],
'dpcm' => ['dpi', 'dpcm', 'dppx'],
'dppx' => ['dpi', 'dpcm', 'dppx'],
];
/**
* @var string
* @readonly
*/
private $unit;
/**
* @param float $value
* @param string $unit
* @param array{SassNumber, SassNumber}|null $asSlash
*/
public function __construct(float $value, string $unit, array $asSlash = null)
{
parent::__construct($value, $asSlash);
$this->unit = $unit;
}
public function getNumeratorUnits(): array
{
return [$this->unit];
}
public function getDenominatorUnits(): array
{
return [];
}
public function hasUnits(): bool
{
return true;
}
protected function withValue(float $value): SassNumber
{
return new self($value, $this->unit);
}
public function withSlash(SassNumber $numerator, SassNumber $denominator): SassNumber
{
return new self($this->getValue(), $this->unit, array($numerator, $denominator));
}
public function hasUnit(string $unit): bool
{
return $unit === $this->unit;
}
public function hasCompatibleUnits(SassNumber $other): bool
{
return $other instanceof SingleUnitSassNumber && $this->compatibleWithUnit($other->unit);
}
public function hasPossiblyCompatibleUnits(SassNumber $other): bool
{
if (!$other instanceof SingleUnitSassNumber) {
return false;
}
$knownCompatibilities = self::KNOWN_COMPATIBILITIES_BY_UNIT[strtolower($this->unit)] ?? null;
if ($knownCompatibilities === null) {
return true;
}
$otherUnit = strtolower($other->unit);
return !isset(self::KNOWN_COMPATIBILITIES_BY_UNIT[$otherUnit]) || \in_array($otherUnit, $knownCompatibilities, true);
}
public function compatibleWithUnit(string $unit): bool
{
return self::getConversionFactor($this->unit, $unit) !== null;
}
public function coerceToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): SassNumber
{
if ($other instanceof SingleUnitSassNumber) {
$coerced = $this->tryCoerceToUnit($other->unit);
if ($coerced !== null) {
return $coerced;
}
}
// Call the parent to generate a consistent error message.
return parent::coerceToMatch($other, $name, $otherName);
}
public function coerceValueToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): float
{
if ($other instanceof SingleUnitSassNumber) {
$coerced = $this->tryCoerceValueToUnit($other->unit);
if ($coerced !== null) {
return $coerced;
}
}
// Call the parent to generate a consistent error message.
return parent::coerceValueToMatch($other, $name, $otherName);
}
public function convertToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): SassNumber
{
if ($other instanceof SingleUnitSassNumber) {
$coerced = $this->tryCoerceToUnit($other->unit);
if ($coerced !== null) {
return $coerced;
}
}
// Call the parent to generate a consistent error message.
return parent::convertToMatch($other, $name, $otherName);
}
public function convertValueToMatch(SassNumber $other, ?string $name = null, ?string $otherName = null): float
{
if ($other instanceof SingleUnitSassNumber) {
$coerced = $this->tryCoerceValueToUnit($other->unit);
if ($coerced !== null) {
return $coerced;
}
}
// Call the parent to generate a consistent error message.
return parent::convertValueToMatch($other, $name, $otherName);
}
public function coerce(array $newNumeratorUnits, array $newDenominatorUnits, ?string $name = null): SassNumber
{
if (\count($newNumeratorUnits) === 1 && \count($newDenominatorUnits) === 0) {
$coerced = $this->tryCoerceToUnit($newNumeratorUnits[0]);
if ($coerced !== null) {
return $coerced;
}
}
// Call the parent to generate a consistent error message.
return parent::coerce($newNumeratorUnits, $newDenominatorUnits, $name);
}
public function coerceValue(array $newNumeratorUnits, array $newDenominatorUnits, ?string $name = null): float
{
if (\count($newNumeratorUnits) === 1 && \count($newDenominatorUnits) === 0) {
$coerced = $this->tryCoerceValueToUnit($newNumeratorUnits[0]);
if ($coerced !== null) {
return $coerced;
}
}
// Call the parent to generate a consistent error message.
return parent::coerceValue($newNumeratorUnits, $newDenominatorUnits, $name);
}
public function coerceValueToUnit(string $unit, ?string $name = null): float
{
$coerced = $this->tryCoerceValueToUnit($unit);
if ($coerced !== null) {
return $coerced;
}
// Call the parent to generate a consistent error message.
return parent::coerceValueToUnit($unit, $name);
}
public function unaryMinus(): Value
{
return new self(-$this->getValue(), $this->unit);
}
public function equals(object $other): bool
{
if ($other instanceof SingleUnitSassNumber) {
$factor = self::getConversionFactor($other->unit, $this->unit);
return $factor !== null && NumberUtil::fuzzyEquals($this->getValue() * $factor, $other->getValue());
}
return false;
}
/**
* @param float $value
* @param list<string> $otherNumerators
* @param list<string> $otherDenominators
*
* @return SassNumber
*/
protected function multiplyUnits(float $value, array $otherNumerators, array $otherDenominators): SassNumber
{
$newNumerators = $otherDenominators;
$removed = false;
foreach ($otherDenominators as $key => $denominator) {
$conversionFactor = self::getConversionFactor($denominator, $this->unit);
if (\is_null($conversionFactor)) {
continue;
}
$value *= $conversionFactor;
unset($otherDenominators[$key]);
$removed = true;
break;
}
if ($removed) {
$otherDenominators = array_values($otherDenominators);
} else {
array_unshift($newNumerators, $this->unit);
}
return SassNumber::withUnits($value, $newNumerators, $otherDenominators);
}
private function tryCoerceToUnit(string $unit): ?SassNumber
{
if ($unit === $this->unit) {
return $this;
}
$factor = self::getConversionFactor($unit, $this->unit);
if ($factor === null) {
return null;
}
return new SingleUnitSassNumber($this->getValue() * $factor, $unit);
}
private function tryCoerceValueToUnit(string $unit): ?float
{
$factor = self::getConversionFactor($unit, $this->unit);
if ($factor === null) {
return null;
}
return $this->getValue() * $factor;
}
}