See Release Notes
Long Term Support Release
<?php namespace Sabberworm\CSS\Value;> use Sabberworm\CSS\OutputFormat;use Sabberworm\CSS\Parsing\ParserState;> use Sabberworm\CSS\Parsing\UnexpectedEOFException; > use Sabberworm\CSS\Parsing\UnexpectedTokenException;< class Color extends CSSFunction { < < public function __construct($aColor, $iLineNo = 0) {> class Color extends CSSFunction > { > /** > * @param array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string> $aColor > * @param int $iLineNo > */ > public function __construct(array $aColor, $iLineNo = 0) > {parent::__construct(implode('', array_keys($aColor)), $aColor, ',', $iLineNo); }< public static function parse(ParserState $oParserState) { < $aColor = array();> /** > * @return Color|CSSFunction > * > * @throws UnexpectedEOFException > * @throws UnexpectedTokenException > */ > public static function parse(ParserState $oParserState) > { > $aColor = [];if ($oParserState->comes('#')) { $oParserState->consume('#'); $sValue = $oParserState->parseIdentifier(false); if ($oParserState->strlen($sValue) === 3) { $sValue = $sValue[0] . $sValue[0] . $sValue[1] . $sValue[1] . $sValue[2] . $sValue[2]; } else if ($oParserState->strlen($sValue) === 4) {< $sValue = $sValue[0] . $sValue[0] . $sValue[1] . $sValue[1] . $sValue[2] . $sValue[2] . $sValue[3] . $sValue[3];> $sValue = $sValue[0] . $sValue[0] . $sValue[1] . $sValue[1] . $sValue[2] . $sValue[2] . $sValue[3] > . $sValue[3];} if ($oParserState->strlen($sValue) === 8) {< $aColor = array(> $aColor = ['r' => new Size(intval($sValue[0] . $sValue[1], 16), null, true, $oParserState->currentLine()), 'g' => new Size(intval($sValue[2] . $sValue[3], 16), null, true, $oParserState->currentLine()), 'b' => new Size(intval($sValue[4] . $sValue[5], 16), null, true, $oParserState->currentLine()),< 'a' => new Size(round(self::mapRange(intval($sValue[6] . $sValue[7], 16), 0, 255, 0, 1), 2), null, true, $oParserState->currentLine()) < );> 'a' => new Size( > round(self::mapRange(intval($sValue[6] . $sValue[7], 16), 0, 255, 0, 1), 2), > null, > true, > $oParserState->currentLine() > ), > ];} else {< $aColor = array(> $aColor = ['r' => new Size(intval($sValue[0] . $sValue[1], 16), null, true, $oParserState->currentLine()), 'g' => new Size(intval($sValue[2] . $sValue[3], 16), null, true, $oParserState->currentLine()),< 'b' => new Size(intval($sValue[4] . $sValue[5], 16), null, true, $oParserState->currentLine()) < );> 'b' => new Size(intval($sValue[4] . $sValue[5], 16), null, true, $oParserState->currentLine()), > ];} } else { $sColorMode = $oParserState->parseIdentifier(true); $oParserState->consumeWhiteSpace(); $oParserState->consume('(');> $iLength = $oParserState->strlen($sColorMode); > $bContainsVar = false;for ($i = 0; $i < $iLength; ++$i) { $oParserState->consumeWhiteSpace();> if ($oParserState->comes('var')) { $aColor[$sColorMode[$i]] = Size::parse($oParserState, true); > $aColor[$sColorMode[$i]] = CSSFunction::parseIdentifierOrFunction($oParserState); $oParserState->consumeWhiteSpace(); > $bContainsVar = true; if ($i < ($iLength - 1)) { > } else {$oParserState->consume(',');> } } > } > if ($bContainsVar && $oParserState->comes(')')) { $oParserState->consume(')'); > // With a var argument the function can have fewer arguments } > break; return new Color($aColor, $oParserState->currentLine()); > } } >> private static function mapRange($fVal, $fFromMin, $fFromMax, $fToMin, $fToMax) { > if ($bContainsVar) { $fFromRange = $fFromMax - $fFromMin; > return new CSSFunction($sColorMode, array_values($aColor), ',', $oParserState->currentLine()); $fToRange = $fToMax - $fToMin; > }< private static function mapRange($fVal, $fFromMin, $fFromMax, $fToMin, $fToMax) {> /** > * @param float $fVal > * @param float $fFromMin > * @param float $fFromMax > * @param float $fToMin > * @param float $fToMax > * > * @return float > */ > private static function mapRange($fVal, $fFromMin, $fFromMax, $fToMin, $fToMax) > {$fNewVal = $fVal - $fFromMin; $fNewVal *= $fMultiplier; return $fNewVal + $fToMin; }< public function getColor() {> /** > * @return array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string> > */ > public function getColor() > {return $this->aComponents; }< public function setColor($aColor) {> /** > * @param array<int, RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string> $aColor > * > * @return void > */ > public function setColor(array $aColor) > {$this->setName(implode('', array_keys($aColor))); $this->aComponents = $aColor; }< public function getColorDescription() {> /** > * @return string > */ > public function getColorDescription() > {return $this->getName(); }< public function __toString() { < return $this->render(new \Sabberworm\CSS\OutputFormat());> /** > * @return string > */ > public function __toString() > { > return $this->render(new OutputFormat());}< public function render(\Sabberworm\CSS\OutputFormat $oOutputFormat) {> /** > * @return string > */ > public function render(OutputFormat $oOutputFormat) > {// Shorthand RGB color values if($oOutputFormat->getRGBHashNotation() && implode('', array_keys($this->aComponents)) === 'rgb') { $sResult = sprintf( '%02x%02x%02x', $this->aComponents['r']->getSize(), $this->aComponents['g']->getSize(), $this->aComponents['b']->getSize() );< return '#'.(($sResult[0] == $sResult[1]) && ($sResult[2] == $sResult[3]) && ($sResult[4] == $sResult[5]) ? "$sResult[0]$sResult[2]$sResult[4]" : $sResult);> return '#' . (($sResult[0] == $sResult[1]) && ($sResult[2] == $sResult[3]) && ($sResult[4] == $sResult[5]) > ? "$sResult[0]$sResult[2]$sResult[4]" : $sResult);} return parent::render($oOutputFormat); } }