181 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			181 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								declare(strict_types = 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace BaconQrCode\Common;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use BaconQrCode\Exception\InvalidArgumentException;
							 | 
						||
| 
								 | 
							
								use DASPRiD\Enum\AbstractEnum;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Encapsulates a Character Set ECI, according to "Extended Channel Interpretations" 5.3.1.1 of ISO 18004.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @method static self CP437()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_1()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_2()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_3()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_4()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_5()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_6()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_7()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_8()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_9()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_10()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_11()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_12()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_13()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_14()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_15()
							 | 
						||
| 
								 | 
							
								 * @method static self ISO8859_16()
							 | 
						||
| 
								 | 
							
								 * @method static self SJIS()
							 | 
						||
| 
								 | 
							
								 * @method static self CP1250()
							 | 
						||
| 
								 | 
							
								 * @method static self CP1251()
							 | 
						||
| 
								 | 
							
								 * @method static self CP1252()
							 | 
						||
| 
								 | 
							
								 * @method static self CP1256()
							 | 
						||
| 
								 | 
							
								 * @method static self UNICODE_BIG_UNMARKED()
							 | 
						||
| 
								 | 
							
								 * @method static self UTF8()
							 | 
						||
| 
								 | 
							
								 * @method static self ASCII()
							 | 
						||
| 
								 | 
							
								 * @method static self BIG5()
							 | 
						||
| 
								 | 
							
								 * @method static self GB18030()
							 | 
						||
| 
								 | 
							
								 * @method static self EUC_KR()
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								final class CharacterSetEci extends AbstractEnum
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    protected const CP437 = [[0, 2]];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_1 = [[1, 3], 'ISO-8859-1'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_2 = [[4], 'ISO-8859-2'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_3 = [[5], 'ISO-8859-3'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_4 = [[6], 'ISO-8859-4'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_5 = [[7], 'ISO-8859-5'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_6 = [[8], 'ISO-8859-6'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_7 = [[9], 'ISO-8859-7'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_8 = [[10], 'ISO-8859-8'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_9 = [[11], 'ISO-8859-9'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_10 = [[12], 'ISO-8859-10'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_11 = [[13], 'ISO-8859-11'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_12 = [[14], 'ISO-8859-12'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_13 = [[15], 'ISO-8859-13'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_14 = [[16], 'ISO-8859-14'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_15 = [[17], 'ISO-8859-15'];
							 | 
						||
| 
								 | 
							
								    protected const ISO8859_16 = [[18], 'ISO-8859-16'];
							 | 
						||
| 
								 | 
							
								    protected const SJIS = [[20], 'Shift_JIS'];
							 | 
						||
| 
								 | 
							
								    protected const CP1250 = [[21], 'windows-1250'];
							 | 
						||
| 
								 | 
							
								    protected const CP1251 = [[22], 'windows-1251'];
							 | 
						||
| 
								 | 
							
								    protected const CP1252 = [[23], 'windows-1252'];
							 | 
						||
| 
								 | 
							
								    protected const CP1256 = [[24], 'windows-1256'];
							 | 
						||
| 
								 | 
							
								    protected const UNICODE_BIG_UNMARKED = [[25], 'UTF-16BE', 'UnicodeBig'];
							 | 
						||
| 
								 | 
							
								    protected const UTF8 = [[26], 'UTF-8'];
							 | 
						||
| 
								 | 
							
								    protected const ASCII = [[27, 170], 'US-ASCII'];
							 | 
						||
| 
								 | 
							
								    protected const BIG5 = [[28]];
							 | 
						||
| 
								 | 
							
								    protected const GB18030 = [[29], 'GB2312', 'EUC_CN', 'GBK'];
							 | 
						||
| 
								 | 
							
								    protected const EUC_KR = [[30], 'EUC-KR'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @var int[]
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    private $values;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @var string[]
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    private $otherEncodingNames;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @var array<int, self>|null
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    private static $valueToEci;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @var array<string, self>|null
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    private static $nameToEci;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function __construct(array $values, string ...$otherEncodingNames)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->values = $values;
							 | 
						||
| 
								 | 
							
								        $this->otherEncodingNames = $otherEncodingNames;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Returns the primary value.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getValue() : int
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->values[0];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Gets character set ECI by value.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * Returns the representing ECI of a given value, or null if it is legal but unsupported.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @throws InvalidArgumentException if value is not between 0 and 900
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function getCharacterSetEciByValue(int $value) : ?self
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if ($value < 0 || $value >= 900) {
							 | 
						||
| 
								 | 
							
								            throw new InvalidArgumentException('Value must be between 0 and 900');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $valueToEci = self::valueToEci();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (! array_key_exists($value, $valueToEci)) {
							 | 
						||
| 
								 | 
							
								            return null;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $valueToEci[$value];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Returns character set ECI by name.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * Returns the representing ECI of a given name, or null if it is legal but unsupported
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function getCharacterSetEciByName(string $name) : ?self
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $nameToEci = self::nameToEci();
							 | 
						||
| 
								 | 
							
								        $name = strtolower($name);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (! array_key_exists($name, $nameToEci)) {
							 | 
						||
| 
								 | 
							
								            return null;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $nameToEci[$name];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private static function valueToEci() : array
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (null !== self::$valueToEci) {
							 | 
						||
| 
								 | 
							
								            return self::$valueToEci;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self::$valueToEci = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        foreach (self::values() as $eci) {
							 | 
						||
| 
								 | 
							
								            foreach ($eci->values as $value) {
							 | 
						||
| 
								 | 
							
								                self::$valueToEci[$value] = $eci;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return self::$valueToEci;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private static function nameToEci() : array
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (null !== self::$nameToEci) {
							 | 
						||
| 
								 | 
							
								            return self::$nameToEci;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self::$nameToEci = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        foreach (self::values() as $eci) {
							 | 
						||
| 
								 | 
							
								            self::$nameToEci[strtolower($eci->name())] = $eci;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            foreach ($eci->otherEncodingNames as $name) {
							 | 
						||
| 
								 | 
							
								                self::$nameToEci[strtolower($name)] = $eci;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return self::$nameToEci;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |