Вход Регистрация
Файл: vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php
Строк: 83
<?php

declare(strict_types=1);

namespace 
InterventionImageColorsRgbDecoders;

use 
InterventionImageColorsRgbColor;
use 
InterventionImageDriversAbstractDecoder;
use 
InterventionImageExceptionsColorDecoderException;
use 
InterventionImageExceptionsInvalidArgumentException;
use 
InterventionImageInterfacesColorInterface;
use 
InterventionImageInterfacesDecoderInterface;

class 
StringColorDecoder extends AbstractDecoder implements DecoderInterface
{
    
/**
     * Regex pattern of rgb color syntax.
     */
    
private const string PATTERN =
    
'/^s?rgba? ?( ?' .
        
'(?P<r>[0-9]{1,3})([, ]) ?' .
        
'(?P<g>[0-9]{1,3})2 ?' .
        
'(?<b>[0-9]{1,3})' .
        
'(?:(?:(?: ?/ ?)|(?:[, ]) ?)' .
        
'(?<a>(?:0.[0-9]+)|1.0|.[0-9]+|[0-9]{1,3}%|1|0))?' .
        
' ?)$/i';

    
/**
     * {@inheritdoc}
     *
     * @see DecoderInterface::supports()
     */
    
public function supports(mixed $input): bool
    
{
        if (!
is_string($input)) {
            return 
false;
        }

        if (
preg_match('/^s?rgb/i'$input) !== 1) {
            return 
false;
        }

        return 
true;
    }

    
/**
     * Decode rgb color strings.
     *
     * @throws InvalidArgumentException
     * @throws ColorDecoderException
     */
    
public function decode(mixed $input): ColorInterface
    
{
        if (
preg_match(self::PATTERN$input$matches) !== 1) {
            throw new 
InvalidArgumentException('Invalid rgb() color syntax "' $input '"');
        }

        
// rgb values
        
$values array_map(fn(string $value): int => match (strpos($value'%')) {
            
false => intval(trim($value)),
            default => 
intval(round(floatval(trim(str_replace('%'''$value))) / 100 255)),
        }, [
$matches['r'], $matches['g'], $matches['b']]);

        
// alpha value
        
if (array_key_exists('a'$matches)) {
            
$values[] = match (strpos($matches['a'], '%')) {
                
false => floatval(trim($matches['a'])),
                default => 
floatval(trim(str_replace('%'''$matches['a']))) / 100,
            };
        }

        try {
            return new 
Color(...$values);
        } catch (
InvalidArgumentException $e) {
            throw new 
ColorDecoderException('Failed to decode RGB color string'previous$e);
        }
    }
}
Онлайн: 1
Реклама