first commit
This commit is contained in:
@@ -0,0 +1,716 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com> and Trevor Rowbotham <trevor.rowbotham@pm.me>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace VendorDuplicator\Symfony\Polyfill\Intl\Idn;
|
||||
|
||||
use Exception;
|
||||
use Normalizer;
|
||||
use VendorDuplicator\Symfony\Polyfill\Intl\Idn\Resources\unidata\DisallowedRanges;
|
||||
use VendorDuplicator\Symfony\Polyfill\Intl\Idn\Resources\unidata\Regex;
|
||||
/**
|
||||
* @see https://www.unicode.org/reports/tr46/
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
final class Idn
|
||||
{
|
||||
const ERROR_EMPTY_LABEL = 1;
|
||||
const ERROR_LABEL_TOO_LONG = 2;
|
||||
const ERROR_DOMAIN_NAME_TOO_LONG = 4;
|
||||
const ERROR_LEADING_HYPHEN = 8;
|
||||
const ERROR_TRAILING_HYPHEN = 0x10;
|
||||
const ERROR_HYPHEN_3_4 = 0x20;
|
||||
const ERROR_LEADING_COMBINING_MARK = 0x40;
|
||||
const ERROR_DISALLOWED = 0x80;
|
||||
const ERROR_PUNYCODE = 0x100;
|
||||
const ERROR_LABEL_HAS_DOT = 0x200;
|
||||
const ERROR_INVALID_ACE_LABEL = 0x400;
|
||||
const ERROR_BIDI = 0x800;
|
||||
const ERROR_CONTEXTJ = 0x1000;
|
||||
const ERROR_CONTEXTO_PUNCTUATION = 0x2000;
|
||||
const ERROR_CONTEXTO_DIGITS = 0x4000;
|
||||
const INTL_IDNA_VARIANT_2003 = 0;
|
||||
const INTL_IDNA_VARIANT_UTS46 = 1;
|
||||
const IDNA_DEFAULT = 0;
|
||||
const IDNA_ALLOW_UNASSIGNED = 1;
|
||||
const IDNA_USE_STD3_RULES = 2;
|
||||
const IDNA_CHECK_BIDI = 4;
|
||||
const IDNA_CHECK_CONTEXTJ = 8;
|
||||
const IDNA_NONTRANSITIONAL_TO_ASCII = 16;
|
||||
const IDNA_NONTRANSITIONAL_TO_UNICODE = 32;
|
||||
const MAX_DOMAIN_SIZE = 253;
|
||||
const MAX_LABEL_SIZE = 63;
|
||||
const BASE = 36;
|
||||
const TMIN = 1;
|
||||
const TMAX = 26;
|
||||
const SKEW = 38;
|
||||
const DAMP = 700;
|
||||
const INITIAL_BIAS = 72;
|
||||
const INITIAL_N = 128;
|
||||
const DELIMITER = '-';
|
||||
const MAX_INT = 2147483647;
|
||||
/**
|
||||
* Contains the numeric value of a basic code point (for use in representing integers) in the
|
||||
* range 0 to BASE-1, or -1 if b is does not represent a value.
|
||||
*
|
||||
* @var array<int, int>
|
||||
*/
|
||||
private static $basicToDigit = array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1);
|
||||
/**
|
||||
* @var array<int, int>
|
||||
*/
|
||||
private static $virama;
|
||||
/**
|
||||
* @var array<int, string>
|
||||
*/
|
||||
private static $mapped;
|
||||
/**
|
||||
* @var array<int, bool>
|
||||
*/
|
||||
private static $ignored;
|
||||
/**
|
||||
* @var array<int, string>
|
||||
*/
|
||||
private static $deviation;
|
||||
/**
|
||||
* @var array<int, bool>
|
||||
*/
|
||||
private static $disallowed;
|
||||
/**
|
||||
* @var array<int, string>
|
||||
*/
|
||||
private static $disallowed_STD3_mapped;
|
||||
/**
|
||||
* @var array<int, bool>
|
||||
*/
|
||||
private static $disallowed_STD3_valid;
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private static $mappingTableLoaded = \false;
|
||||
/**
|
||||
* @see https://www.unicode.org/reports/tr46/#ToASCII
|
||||
*
|
||||
* @param string $domainName
|
||||
* @param int $options
|
||||
* @param int $variant
|
||||
* @param array $idna_info
|
||||
*
|
||||
* @return string|false
|
||||
*/
|
||||
public static function idn_to_ascii($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = array())
|
||||
{
|
||||
if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) {
|
||||
@\trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED);
|
||||
}
|
||||
$options = array('CheckHyphens' => \true, 'CheckBidi' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 !== ($options & self::IDNA_CHECK_BIDI), 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & self::IDNA_CHECK_CONTEXTJ), 'UseSTD3ASCIIRules' => 0 !== ($options & self::IDNA_USE_STD3_RULES), 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & self::IDNA_NONTRANSITIONAL_TO_ASCII), 'VerifyDnsLength' => \true);
|
||||
$info = new Info();
|
||||
$labels = self::process((string) $domainName, $options, $info);
|
||||
foreach ($labels as $i => $label) {
|
||||
// Only convert labels to punycode that contain non-ASCII code points
|
||||
if (1 === \preg_match('/[^\\x00-\\x7F]/', $label)) {
|
||||
try {
|
||||
$label = 'xn--' . self::punycodeEncode($label);
|
||||
} catch (Exception $e) {
|
||||
$info->errors |= self::ERROR_PUNYCODE;
|
||||
}
|
||||
$labels[$i] = $label;
|
||||
}
|
||||
}
|
||||
if ($options['VerifyDnsLength']) {
|
||||
self::validateDomainAndLabelLength($labels, $info);
|
||||
}
|
||||
$idna_info = array('result' => \implode('.', $labels), 'isTransitionalDifferent' => $info->transitionalDifferent, 'errors' => $info->errors);
|
||||
return 0 === $info->errors ? $idna_info['result'] : \false;
|
||||
}
|
||||
/**
|
||||
* @see https://www.unicode.org/reports/tr46/#ToUnicode
|
||||
*
|
||||
* @param string $domainName
|
||||
* @param int $options
|
||||
* @param int $variant
|
||||
* @param array $idna_info
|
||||
*
|
||||
* @return string|false
|
||||
*/
|
||||
public static function idn_to_utf8($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = array())
|
||||
{
|
||||
if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) {
|
||||
@\trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED);
|
||||
}
|
||||
$info = new Info();
|
||||
$labels = self::process((string) $domainName, array('CheckHyphens' => \true, 'CheckBidi' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 !== ($options & self::IDNA_CHECK_BIDI), 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & self::IDNA_CHECK_CONTEXTJ), 'UseSTD3ASCIIRules' => 0 !== ($options & self::IDNA_USE_STD3_RULES), 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & self::IDNA_NONTRANSITIONAL_TO_UNICODE)), $info);
|
||||
$idna_info = array('result' => \implode('.', $labels), 'isTransitionalDifferent' => $info->transitionalDifferent, 'errors' => $info->errors);
|
||||
return 0 === $info->errors ? $idna_info['result'] : \false;
|
||||
}
|
||||
/**
|
||||
* @param string $label
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private static function isValidContextJ(array $codePoints, $label)
|
||||
{
|
||||
if (!isset(self::$virama)) {
|
||||
self::$virama = (require __DIR__ . \DIRECTORY_SEPARATOR . 'Resources' . \DIRECTORY_SEPARATOR . 'unidata' . \DIRECTORY_SEPARATOR . 'virama.php');
|
||||
}
|
||||
$offset = 0;
|
||||
foreach ($codePoints as $i => $codePoint) {
|
||||
if (0x200c !== $codePoint && 0x200d !== $codePoint) {
|
||||
continue;
|
||||
}
|
||||
if (!isset($codePoints[$i - 1])) {
|
||||
return \false;
|
||||
}
|
||||
// If Canonical_Combining_Class(Before(cp)) .eq. Virama Then True;
|
||||
if (isset(self::$virama[$codePoints[$i - 1]])) {
|
||||
continue;
|
||||
}
|
||||
// If RegExpMatch((Joining_Type:{L,D})(Joining_Type:T)*\u200C(Joining_Type:T)*(Joining_Type:{R,D})) Then
|
||||
// True;
|
||||
// Generated RegExp = ([Joining_Type:{L,D}][Joining_Type:T]*\u200C[Joining_Type:T]*)[Joining_Type:{R,D}]
|
||||
if (0x200c === $codePoint && 1 === \preg_match(Regex::ZWNJ, $label, $matches, \PREG_OFFSET_CAPTURE, $offset)) {
|
||||
$offset += \strlen($matches[1][0]);
|
||||
continue;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
return \true;
|
||||
}
|
||||
/**
|
||||
* @see https://www.unicode.org/reports/tr46/#ProcessingStepMap
|
||||
*
|
||||
* @param string $input
|
||||
* @param array<string, bool> $options
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private static function mapCodePoints($input, array $options, Info $info)
|
||||
{
|
||||
$str = '';
|
||||
$useSTD3ASCIIRules = $options['UseSTD3ASCIIRules'];
|
||||
$transitional = $options['Transitional_Processing'];
|
||||
foreach (self::utf8Decode($input) as $codePoint) {
|
||||
$data = self::lookupCodePointStatus($codePoint, $useSTD3ASCIIRules);
|
||||
switch ($data['status']) {
|
||||
case 'disallowed':
|
||||
$info->errors |= self::ERROR_DISALLOWED;
|
||||
// no break.
|
||||
case 'valid':
|
||||
$str .= \mb_chr($codePoint, 'utf-8');
|
||||
break;
|
||||
case 'ignored':
|
||||
// Do nothing.
|
||||
break;
|
||||
case 'mapped':
|
||||
$str .= $data['mapping'];
|
||||
break;
|
||||
case 'deviation':
|
||||
$info->transitionalDifferent = \true;
|
||||
$str .= $transitional ? $data['mapping'] : \mb_chr($codePoint, 'utf-8');
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
/**
|
||||
* @see https://www.unicode.org/reports/tr46/#Processing
|
||||
*
|
||||
* @param string $domain
|
||||
* @param array<string, bool> $options
|
||||
*
|
||||
* @return array<int, string>
|
||||
*/
|
||||
private static function process($domain, array $options, Info $info)
|
||||
{
|
||||
// If VerifyDnsLength is not set, we are doing ToUnicode otherwise we are doing ToASCII and
|
||||
// we need to respect the VerifyDnsLength option.
|
||||
$checkForEmptyLabels = !isset($options['VerifyDnsLength']) || $options['VerifyDnsLength'];
|
||||
if ($checkForEmptyLabels && '' === $domain) {
|
||||
$info->errors |= self::ERROR_EMPTY_LABEL;
|
||||
return array($domain);
|
||||
}
|
||||
// Step 1. Map each code point in the domain name string
|
||||
$domain = self::mapCodePoints($domain, $options, $info);
|
||||
// Step 2. Normalize the domain name string to Unicode Normalization Form C.
|
||||
if (!Normalizer::isNormalized($domain, Normalizer::FORM_C)) {
|
||||
$domain = Normalizer::normalize($domain, Normalizer::FORM_C);
|
||||
}
|
||||
// Step 3. Break the string into labels at U+002E (.) FULL STOP.
|
||||
$labels = \explode('.', $domain);
|
||||
$lastLabelIndex = \count($labels) - 1;
|
||||
// Step 4. Convert and validate each label in the domain name string.
|
||||
foreach ($labels as $i => $label) {
|
||||
$validationOptions = $options;
|
||||
if ('xn--' === \substr($label, 0, 4)) {
|
||||
try {
|
||||
$label = self::punycodeDecode(\substr($label, 4));
|
||||
} catch (Exception $e) {
|
||||
$info->errors |= self::ERROR_PUNYCODE;
|
||||
continue;
|
||||
}
|
||||
$validationOptions['Transitional_Processing'] = \false;
|
||||
$labels[$i] = $label;
|
||||
}
|
||||
self::validateLabel($label, $info, $validationOptions, $i > 0 && $i === $lastLabelIndex);
|
||||
}
|
||||
if ($info->bidiDomain && !$info->validBidiDomain) {
|
||||
$info->errors |= self::ERROR_BIDI;
|
||||
}
|
||||
// Any input domain name string that does not record an error has been successfully
|
||||
// processed according to this specification. Conversely, if an input domain_name string
|
||||
// causes an error, then the processing of the input domain_name string fails. Determining
|
||||
// what to do with error input is up to the caller, and not in the scope of this document.
|
||||
return $labels;
|
||||
}
|
||||
/**
|
||||
* @see https://tools.ietf.org/html/rfc5893#section-2
|
||||
*
|
||||
* @param string $label
|
||||
*/
|
||||
private static function validateBidiLabel($label, Info $info)
|
||||
{
|
||||
if (1 === \preg_match(Regex::RTL_LABEL, $label)) {
|
||||
$info->bidiDomain = \true;
|
||||
// Step 1. The first character must be a character with Bidi property L, R, or AL.
|
||||
// If it has the R or AL property, it is an RTL label
|
||||
if (1 !== \preg_match(Regex::BIDI_STEP_1_RTL, $label)) {
|
||||
$info->validBidiDomain = \false;
|
||||
return;
|
||||
}
|
||||
// Step 2. In an RTL label, only characters with the Bidi properties R, AL, AN, EN, ES,
|
||||
// CS, ET, ON, BN, or NSM are allowed.
|
||||
if (1 === \preg_match(Regex::BIDI_STEP_2, $label)) {
|
||||
$info->validBidiDomain = \false;
|
||||
return;
|
||||
}
|
||||
// Step 3. In an RTL label, the end of the label must be a character with Bidi property
|
||||
// R, AL, EN, or AN, followed by zero or more characters with Bidi property NSM.
|
||||
if (1 !== \preg_match(Regex::BIDI_STEP_3, $label)) {
|
||||
$info->validBidiDomain = \false;
|
||||
return;
|
||||
}
|
||||
// Step 4. In an RTL label, if an EN is present, no AN may be present, and vice versa.
|
||||
if (1 === \preg_match(Regex::BIDI_STEP_4_AN, $label) && 1 === \preg_match(Regex::BIDI_STEP_4_EN, $label)) {
|
||||
$info->validBidiDomain = \false;
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
// We are a LTR label
|
||||
// Step 1. The first character must be a character with Bidi property L, R, or AL.
|
||||
// If it has the L property, it is an LTR label.
|
||||
if (1 !== \preg_match(Regex::BIDI_STEP_1_LTR, $label)) {
|
||||
$info->validBidiDomain = \false;
|
||||
return;
|
||||
}
|
||||
// Step 5. In an LTR label, only characters with the Bidi properties L, EN,
|
||||
// ES, CS, ET, ON, BN, or NSM are allowed.
|
||||
if (1 === \preg_match(Regex::BIDI_STEP_5, $label)) {
|
||||
$info->validBidiDomain = \false;
|
||||
return;
|
||||
}
|
||||
// Step 6.In an LTR label, the end of the label must be a character with Bidi property L or
|
||||
// EN, followed by zero or more characters with Bidi property NSM.
|
||||
if (1 !== \preg_match(Regex::BIDI_STEP_6, $label)) {
|
||||
$info->validBidiDomain = \false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @param array<int, string> $labels
|
||||
*/
|
||||
private static function validateDomainAndLabelLength(array $labels, Info $info)
|
||||
{
|
||||
$maxDomainSize = self::MAX_DOMAIN_SIZE;
|
||||
$length = \count($labels);
|
||||
// Number of "." delimiters.
|
||||
$domainLength = $length - 1;
|
||||
// If the last label is empty and it is not the first label, then it is the root label.
|
||||
// Increase the max size by 1, making it 254, to account for the root label's "."
|
||||
// delimiter. This also means we don't need to check the last label's length for being too
|
||||
// long.
|
||||
if ($length > 1 && '' === $labels[$length - 1]) {
|
||||
++$maxDomainSize;
|
||||
--$length;
|
||||
}
|
||||
for ($i = 0; $i < $length; ++$i) {
|
||||
$bytes = \strlen($labels[$i]);
|
||||
$domainLength += $bytes;
|
||||
if ($bytes > self::MAX_LABEL_SIZE) {
|
||||
$info->errors |= self::ERROR_LABEL_TOO_LONG;
|
||||
}
|
||||
}
|
||||
if ($domainLength > $maxDomainSize) {
|
||||
$info->errors |= self::ERROR_DOMAIN_NAME_TOO_LONG;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @see https://www.unicode.org/reports/tr46/#Validity_Criteria
|
||||
*
|
||||
* @param string $label
|
||||
* @param array<string, bool> $options
|
||||
* @param bool $canBeEmpty
|
||||
*/
|
||||
private static function validateLabel($label, Info $info, array $options, $canBeEmpty)
|
||||
{
|
||||
if ('' === $label) {
|
||||
if (!$canBeEmpty && (!isset($options['VerifyDnsLength']) || $options['VerifyDnsLength'])) {
|
||||
$info->errors |= self::ERROR_EMPTY_LABEL;
|
||||
}
|
||||
return;
|
||||
}
|
||||
// Step 1. The label must be in Unicode Normalization Form C.
|
||||
if (!Normalizer::isNormalized($label, Normalizer::FORM_C)) {
|
||||
$info->errors |= self::ERROR_INVALID_ACE_LABEL;
|
||||
}
|
||||
$codePoints = self::utf8Decode($label);
|
||||
if ($options['CheckHyphens']) {
|
||||
// Step 2. If CheckHyphens, the label must not contain a U+002D HYPHEN-MINUS character
|
||||
// in both the thrid and fourth positions.
|
||||
if (isset($codePoints[2], $codePoints[3]) && 0x2d === $codePoints[2] && 0x2d === $codePoints[3]) {
|
||||
$info->errors |= self::ERROR_HYPHEN_3_4;
|
||||
}
|
||||
// Step 3. If CheckHyphens, the label must neither begin nor end with a U+002D
|
||||
// HYPHEN-MINUS character.
|
||||
if ('-' === \substr($label, 0, 1)) {
|
||||
$info->errors |= self::ERROR_LEADING_HYPHEN;
|
||||
}
|
||||
if ('-' === \substr($label, -1, 1)) {
|
||||
$info->errors |= self::ERROR_TRAILING_HYPHEN;
|
||||
}
|
||||
}
|
||||
// Step 4. The label must not contain a U+002E (.) FULL STOP.
|
||||
if (\false !== \strpos($label, '.')) {
|
||||
$info->errors |= self::ERROR_LABEL_HAS_DOT;
|
||||
}
|
||||
// Step 5. The label must not begin with a combining mark, that is: General_Category=Mark.
|
||||
if (1 === \preg_match(Regex::COMBINING_MARK, $label)) {
|
||||
$info->errors |= self::ERROR_LEADING_COMBINING_MARK;
|
||||
}
|
||||
// Step 6. Each code point in the label must only have certain status values according to
|
||||
// Section 5, IDNA Mapping Table:
|
||||
$transitional = $options['Transitional_Processing'];
|
||||
$useSTD3ASCIIRules = $options['UseSTD3ASCIIRules'];
|
||||
foreach ($codePoints as $codePoint) {
|
||||
$data = self::lookupCodePointStatus($codePoint, $useSTD3ASCIIRules);
|
||||
$status = $data['status'];
|
||||
if ('valid' === $status || !$transitional && 'deviation' === $status) {
|
||||
continue;
|
||||
}
|
||||
$info->errors |= self::ERROR_DISALLOWED;
|
||||
break;
|
||||
}
|
||||
// Step 7. If CheckJoiners, the label must satisify the ContextJ rules from Appendix A, in
|
||||
// The Unicode Code Points and Internationalized Domain Names for Applications (IDNA)
|
||||
// [IDNA2008].
|
||||
if ($options['CheckJoiners'] && !self::isValidContextJ($codePoints, $label)) {
|
||||
$info->errors |= self::ERROR_CONTEXTJ;
|
||||
}
|
||||
// Step 8. If CheckBidi, and if the domain name is a Bidi domain name, then the label must
|
||||
// satisfy all six of the numbered conditions in [IDNA2008] RFC 5893, Section 2.
|
||||
if ($options['CheckBidi'] && (!$info->bidiDomain || $info->validBidiDomain)) {
|
||||
self::validateBidiLabel($label, $info);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @see https://tools.ietf.org/html/rfc3492#section-6.2
|
||||
*
|
||||
* @param string $input
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private static function punycodeDecode($input)
|
||||
{
|
||||
$n = self::INITIAL_N;
|
||||
$out = 0;
|
||||
$i = 0;
|
||||
$bias = self::INITIAL_BIAS;
|
||||
$lastDelimIndex = \strrpos($input, self::DELIMITER);
|
||||
$b = \false === $lastDelimIndex ? 0 : $lastDelimIndex;
|
||||
$inputLength = \strlen($input);
|
||||
$output = array();
|
||||
$bytes = \array_map('ord', \str_split($input));
|
||||
for ($j = 0; $j < $b; ++$j) {
|
||||
if ($bytes[$j] > 0x7f) {
|
||||
throw new Exception('Invalid input');
|
||||
}
|
||||
$output[$out++] = $input[$j];
|
||||
}
|
||||
if ($b > 0) {
|
||||
++$b;
|
||||
}
|
||||
for ($in = $b; $in < $inputLength; ++$out) {
|
||||
$oldi = $i;
|
||||
$w = 1;
|
||||
for ($k = self::BASE;; $k += self::BASE) {
|
||||
if ($in >= $inputLength) {
|
||||
throw new Exception('Invalid input');
|
||||
}
|
||||
$digit = self::$basicToDigit[$bytes[$in++] & 0xff];
|
||||
if ($digit < 0) {
|
||||
throw new Exception('Invalid input');
|
||||
}
|
||||
if ($digit > \intdiv(self::MAX_INT - $i, $w)) {
|
||||
throw new Exception('Integer overflow');
|
||||
}
|
||||
$i += $digit * $w;
|
||||
if ($k <= $bias) {
|
||||
$t = self::TMIN;
|
||||
} elseif ($k >= $bias + self::TMAX) {
|
||||
$t = self::TMAX;
|
||||
} else {
|
||||
$t = $k - $bias;
|
||||
}
|
||||
if ($digit < $t) {
|
||||
break;
|
||||
}
|
||||
$baseMinusT = self::BASE - $t;
|
||||
if ($w > \intdiv(self::MAX_INT, $baseMinusT)) {
|
||||
throw new Exception('Integer overflow');
|
||||
}
|
||||
$w *= $baseMinusT;
|
||||
}
|
||||
$outPlusOne = $out + 1;
|
||||
$bias = self::adaptBias($i - $oldi, $outPlusOne, 0 === $oldi);
|
||||
if (\intdiv($i, $outPlusOne) > self::MAX_INT - $n) {
|
||||
throw new Exception('Integer overflow');
|
||||
}
|
||||
$n += \intdiv($i, $outPlusOne);
|
||||
$i %= $outPlusOne;
|
||||
\array_splice($output, $i++, 0, array(\mb_chr($n, 'utf-8')));
|
||||
}
|
||||
return \implode('', $output);
|
||||
}
|
||||
/**
|
||||
* @see https://tools.ietf.org/html/rfc3492#section-6.3
|
||||
*
|
||||
* @param string $input
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private static function punycodeEncode($input)
|
||||
{
|
||||
$n = self::INITIAL_N;
|
||||
$delta = 0;
|
||||
$out = 0;
|
||||
$bias = self::INITIAL_BIAS;
|
||||
$inputLength = 0;
|
||||
$output = '';
|
||||
$iter = self::utf8Decode($input);
|
||||
foreach ($iter as $codePoint) {
|
||||
++$inputLength;
|
||||
if ($codePoint < 0x80) {
|
||||
$output .= \chr($codePoint);
|
||||
++$out;
|
||||
}
|
||||
}
|
||||
$h = $out;
|
||||
$b = $out;
|
||||
if ($b > 0) {
|
||||
$output .= self::DELIMITER;
|
||||
++$out;
|
||||
}
|
||||
while ($h < $inputLength) {
|
||||
$m = self::MAX_INT;
|
||||
foreach ($iter as $codePoint) {
|
||||
if ($codePoint >= $n && $codePoint < $m) {
|
||||
$m = $codePoint;
|
||||
}
|
||||
}
|
||||
if ($m - $n > \intdiv(self::MAX_INT - $delta, $h + 1)) {
|
||||
throw new Exception('Integer overflow');
|
||||
}
|
||||
$delta += ($m - $n) * ($h + 1);
|
||||
$n = $m;
|
||||
foreach ($iter as $codePoint) {
|
||||
if ($codePoint < $n && 0 === ++$delta) {
|
||||
throw new Exception('Integer overflow');
|
||||
} elseif ($codePoint === $n) {
|
||||
$q = $delta;
|
||||
for ($k = self::BASE;; $k += self::BASE) {
|
||||
if ($k <= $bias) {
|
||||
$t = self::TMIN;
|
||||
} elseif ($k >= $bias + self::TMAX) {
|
||||
$t = self::TMAX;
|
||||
} else {
|
||||
$t = $k - $bias;
|
||||
}
|
||||
if ($q < $t) {
|
||||
break;
|
||||
}
|
||||
$qMinusT = $q - $t;
|
||||
$baseMinusT = self::BASE - $t;
|
||||
$output .= self::encodeDigit($t + $qMinusT % $baseMinusT, \false);
|
||||
++$out;
|
||||
$q = \intdiv($qMinusT, $baseMinusT);
|
||||
}
|
||||
$output .= self::encodeDigit($q, \false);
|
||||
++$out;
|
||||
$bias = self::adaptBias($delta, $h + 1, $h === $b);
|
||||
$delta = 0;
|
||||
++$h;
|
||||
}
|
||||
}
|
||||
++$delta;
|
||||
++$n;
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
/**
|
||||
* @see https://tools.ietf.org/html/rfc3492#section-6.1
|
||||
*
|
||||
* @param int $delta
|
||||
* @param int $numPoints
|
||||
* @param bool $firstTime
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
private static function adaptBias($delta, $numPoints, $firstTime)
|
||||
{
|
||||
// xxx >> 1 is a faster way of doing intdiv(xxx, 2)
|
||||
$delta = $firstTime ? \intdiv($delta, self::DAMP) : $delta >> 1;
|
||||
$delta += \intdiv($delta, $numPoints);
|
||||
$k = 0;
|
||||
while ($delta > (self::BASE - self::TMIN) * self::TMAX >> 1) {
|
||||
$delta = \intdiv($delta, self::BASE - self::TMIN);
|
||||
$k += self::BASE;
|
||||
}
|
||||
return $k + \intdiv((self::BASE - self::TMIN + 1) * $delta, $delta + self::SKEW);
|
||||
}
|
||||
/**
|
||||
* @param int $d
|
||||
* @param bool $flag
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private static function encodeDigit($d, $flag)
|
||||
{
|
||||
return \chr($d + 22 + 75 * ($d < 26 ? 1 : 0) - (($flag ? 1 : 0) << 5));
|
||||
}
|
||||
/**
|
||||
* Takes a UTF-8 encoded string and converts it into a series of integer code points. Any
|
||||
* invalid byte sequences will be replaced by a U+FFFD replacement code point.
|
||||
*
|
||||
* @see https://encoding.spec.whatwg.org/#utf-8-decoder
|
||||
*
|
||||
* @param string $input
|
||||
*
|
||||
* @return array<int, int>
|
||||
*/
|
||||
private static function utf8Decode($input)
|
||||
{
|
||||
$bytesSeen = 0;
|
||||
$bytesNeeded = 0;
|
||||
$lowerBoundary = 0x80;
|
||||
$upperBoundary = 0xbf;
|
||||
$codePoint = 0;
|
||||
$codePoints = array();
|
||||
$length = \strlen($input);
|
||||
for ($i = 0; $i < $length; ++$i) {
|
||||
$byte = \ord($input[$i]);
|
||||
if (0 === $bytesNeeded) {
|
||||
if ($byte >= 0x0 && $byte <= 0x7f) {
|
||||
$codePoints[] = $byte;
|
||||
continue;
|
||||
}
|
||||
if ($byte >= 0xc2 && $byte <= 0xdf) {
|
||||
$bytesNeeded = 1;
|
||||
$codePoint = $byte & 0x1f;
|
||||
} elseif ($byte >= 0xe0 && $byte <= 0xef) {
|
||||
if (0xe0 === $byte) {
|
||||
$lowerBoundary = 0xa0;
|
||||
} elseif (0xed === $byte) {
|
||||
$upperBoundary = 0x9f;
|
||||
}
|
||||
$bytesNeeded = 2;
|
||||
$codePoint = $byte & 0xf;
|
||||
} elseif ($byte >= 0xf0 && $byte <= 0xf4) {
|
||||
if (0xf0 === $byte) {
|
||||
$lowerBoundary = 0x90;
|
||||
} elseif (0xf4 === $byte) {
|
||||
$upperBoundary = 0x8f;
|
||||
}
|
||||
$bytesNeeded = 3;
|
||||
$codePoint = $byte & 0x7;
|
||||
} else {
|
||||
$codePoints[] = 0xfffd;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ($byte < $lowerBoundary || $byte > $upperBoundary) {
|
||||
$codePoint = 0;
|
||||
$bytesNeeded = 0;
|
||||
$bytesSeen = 0;
|
||||
$lowerBoundary = 0x80;
|
||||
$upperBoundary = 0xbf;
|
||||
--$i;
|
||||
$codePoints[] = 0xfffd;
|
||||
continue;
|
||||
}
|
||||
$lowerBoundary = 0x80;
|
||||
$upperBoundary = 0xbf;
|
||||
$codePoint = $codePoint << 6 | $byte & 0x3f;
|
||||
if (++$bytesSeen !== $bytesNeeded) {
|
||||
continue;
|
||||
}
|
||||
$codePoints[] = $codePoint;
|
||||
$codePoint = 0;
|
||||
$bytesNeeded = 0;
|
||||
$bytesSeen = 0;
|
||||
}
|
||||
// String unexpectedly ended, so append a U+FFFD code point.
|
||||
if (0 !== $bytesNeeded) {
|
||||
$codePoints[] = 0xfffd;
|
||||
}
|
||||
return $codePoints;
|
||||
}
|
||||
/**
|
||||
* @param int $codePoint
|
||||
* @param bool $useSTD3ASCIIRules
|
||||
*
|
||||
* @return array{status: string, mapping?: string}
|
||||
*/
|
||||
private static function lookupCodePointStatus($codePoint, $useSTD3ASCIIRules)
|
||||
{
|
||||
if (!self::$mappingTableLoaded) {
|
||||
self::$mappingTableLoaded = \true;
|
||||
self::$mapped = (require __DIR__ . '/Resources/unidata/mapped.php');
|
||||
self::$ignored = (require __DIR__ . '/Resources/unidata/ignored.php');
|
||||
self::$deviation = (require __DIR__ . '/Resources/unidata/deviation.php');
|
||||
self::$disallowed = (require __DIR__ . '/Resources/unidata/disallowed.php');
|
||||
self::$disallowed_STD3_mapped = (require __DIR__ . '/Resources/unidata/disallowed_STD3_mapped.php');
|
||||
self::$disallowed_STD3_valid = (require __DIR__ . '/Resources/unidata/disallowed_STD3_valid.php');
|
||||
}
|
||||
if (isset(self::$mapped[$codePoint])) {
|
||||
return array('status' => 'mapped', 'mapping' => self::$mapped[$codePoint]);
|
||||
}
|
||||
if (isset(self::$ignored[$codePoint])) {
|
||||
return array('status' => 'ignored');
|
||||
}
|
||||
if (isset(self::$deviation[$codePoint])) {
|
||||
return array('status' => 'deviation', 'mapping' => self::$deviation[$codePoint]);
|
||||
}
|
||||
if (isset(self::$disallowed[$codePoint]) || DisallowedRanges::inRange($codePoint)) {
|
||||
return array('status' => 'disallowed');
|
||||
}
|
||||
$isDisallowedMapped = isset(self::$disallowed_STD3_mapped[$codePoint]);
|
||||
if ($isDisallowedMapped || isset(self::$disallowed_STD3_valid[$codePoint])) {
|
||||
$status = 'disallowed';
|
||||
if (!$useSTD3ASCIIRules) {
|
||||
$status = $isDisallowedMapped ? 'mapped' : 'valid';
|
||||
}
|
||||
if ($isDisallowedMapped) {
|
||||
return array('status' => $status, 'mapping' => self::$disallowed_STD3_mapped[$codePoint]);
|
||||
}
|
||||
return array('status' => $status);
|
||||
}
|
||||
return array('status' => 'valid');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com> and Trevor Rowbotham <trevor.rowbotham@pm.me>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace VendorDuplicator\Symfony\Polyfill\Intl\Idn;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class Info
|
||||
{
|
||||
public $bidiDomain = \false;
|
||||
public $errors = 0;
|
||||
public $validBidiDomain = \true;
|
||||
public $transitionalDifferent = \false;
|
||||
}
|
||||
@@ -0,0 +1,286 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator\Symfony\Polyfill\Intl\Idn\Resources\unidata;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class DisallowedRanges
|
||||
{
|
||||
/**
|
||||
* @param int $codePoint
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function inRange($codePoint)
|
||||
{
|
||||
if ($codePoint >= 128 && $codePoint <= 159) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 2155 && $codePoint <= 2207) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 3676 && $codePoint <= 3712) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 3808 && $codePoint <= 3839) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 4059 && $codePoint <= 4095) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 4256 && $codePoint <= 4293) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 6849 && $codePoint <= 6911) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 11859 && $codePoint <= 11903) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 42955 && $codePoint <= 42996) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 55296 && $codePoint <= 57343) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 57344 && $codePoint <= 63743) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 64218 && $codePoint <= 64255) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 64976 && $codePoint <= 65007) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 65630 && $codePoint <= 65663) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 65953 && $codePoint <= 65999) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 66046 && $codePoint <= 66175) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 66518 && $codePoint <= 66559) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 66928 && $codePoint <= 67071) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 67432 && $codePoint <= 67583) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 67760 && $codePoint <= 67807) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 67904 && $codePoint <= 67967) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 68256 && $codePoint <= 68287) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 68528 && $codePoint <= 68607) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 68681 && $codePoint <= 68735) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 68922 && $codePoint <= 69215) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 69298 && $codePoint <= 69375) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 69466 && $codePoint <= 69551) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 70207 && $codePoint <= 70271) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 70517 && $codePoint <= 70655) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 70874 && $codePoint <= 71039) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 71134 && $codePoint <= 71167) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 71370 && $codePoint <= 71423) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 71488 && $codePoint <= 71679) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 71740 && $codePoint <= 71839) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 72026 && $codePoint <= 72095) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 72441 && $codePoint <= 72703) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 72887 && $codePoint <= 72959) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 73130 && $codePoint <= 73439) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 73465 && $codePoint <= 73647) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 74650 && $codePoint <= 74751) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 75076 && $codePoint <= 77823) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 78905 && $codePoint <= 82943) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 83527 && $codePoint <= 92159) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 92784 && $codePoint <= 92879) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 93072 && $codePoint <= 93759) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 93851 && $codePoint <= 93951) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 94112 && $codePoint <= 94175) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 101590 && $codePoint <= 101631) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 101641 && $codePoint <= 110591) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 110879 && $codePoint <= 110927) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 111356 && $codePoint <= 113663) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 113828 && $codePoint <= 118783) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 119366 && $codePoint <= 119519) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 119673 && $codePoint <= 119807) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 121520 && $codePoint <= 122879) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 122923 && $codePoint <= 123135) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 123216 && $codePoint <= 123583) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 123648 && $codePoint <= 124927) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 125143 && $codePoint <= 125183) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 125280 && $codePoint <= 126064) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 126133 && $codePoint <= 126208) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 126270 && $codePoint <= 126463) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 126652 && $codePoint <= 126703) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 126706 && $codePoint <= 126975) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 127406 && $codePoint <= 127461) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 127590 && $codePoint <= 127743) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 129202 && $codePoint <= 129279) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 129751 && $codePoint <= 129791) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 129995 && $codePoint <= 130031) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 130042 && $codePoint <= 131069) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 173790 && $codePoint <= 173823) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 191457 && $codePoint <= 194559) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 195102 && $codePoint <= 196605) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 201547 && $codePoint <= 262141) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 262144 && $codePoint <= 327677) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 327680 && $codePoint <= 393213) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 393216 && $codePoint <= 458749) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 458752 && $codePoint <= 524285) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 524288 && $codePoint <= 589821) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 589824 && $codePoint <= 655357) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 655360 && $codePoint <= 720893) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 720896 && $codePoint <= 786429) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 786432 && $codePoint <= 851965) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 851968 && $codePoint <= 917501) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 917536 && $codePoint <= 917631) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 917632 && $codePoint <= 917759) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 918000 && $codePoint <= 983037) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 983040 && $codePoint <= 1048573) {
|
||||
return \true;
|
||||
}
|
||||
if ($codePoint >= 1048576 && $codePoint <= 1114109) {
|
||||
return \true;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
return array(223 => 'ss', 962 => 'σ', 8204 => '', 8205 => '');
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
return array(160 => ' ', 168 => ' ̈', 175 => ' ̄', 180 => ' ́', 184 => ' ̧', 728 => ' ̆', 729 => ' ̇', 730 => ' ̊', 731 => ' ̨', 732 => ' ̃', 733 => ' ̋', 890 => ' ι', 894 => ';', 900 => ' ́', 901 => ' ̈́', 8125 => ' ̓', 8127 => ' ̓', 8128 => ' ͂', 8129 => ' ̈͂', 8141 => ' ̓̀', 8142 => ' ̓́', 8143 => ' ̓͂', 8157 => ' ̔̀', 8158 => ' ̔́', 8159 => ' ̔͂', 8173 => ' ̈̀', 8174 => ' ̈́', 8175 => '`', 8189 => ' ́', 8190 => ' ̔', 8192 => ' ', 8193 => ' ', 8194 => ' ', 8195 => ' ', 8196 => ' ', 8197 => ' ', 8198 => ' ', 8199 => ' ', 8200 => ' ', 8201 => ' ', 8202 => ' ', 8215 => ' ̳', 8239 => ' ', 8252 => '!!', 8254 => ' ̅', 8263 => '??', 8264 => '?!', 8265 => '!?', 8287 => ' ', 8314 => '+', 8316 => '=', 8317 => '(', 8318 => ')', 8330 => '+', 8332 => '=', 8333 => '(', 8334 => ')', 8448 => 'a/c', 8449 => 'a/s', 8453 => 'c/o', 8454 => 'c/u', 9332 => '(1)', 9333 => '(2)', 9334 => '(3)', 9335 => '(4)', 9336 => '(5)', 9337 => '(6)', 9338 => '(7)', 9339 => '(8)', 9340 => '(9)', 9341 => '(10)', 9342 => '(11)', 9343 => '(12)', 9344 => '(13)', 9345 => '(14)', 9346 => '(15)', 9347 => '(16)', 9348 => '(17)', 9349 => '(18)', 9350 => '(19)', 9351 => '(20)', 9372 => '(a)', 9373 => '(b)', 9374 => '(c)', 9375 => '(d)', 9376 => '(e)', 9377 => '(f)', 9378 => '(g)', 9379 => '(h)', 9380 => '(i)', 9381 => '(j)', 9382 => '(k)', 9383 => '(l)', 9384 => '(m)', 9385 => '(n)', 9386 => '(o)', 9387 => '(p)', 9388 => '(q)', 9389 => '(r)', 9390 => '(s)', 9391 => '(t)', 9392 => '(u)', 9393 => '(v)', 9394 => '(w)', 9395 => '(x)', 9396 => '(y)', 9397 => '(z)', 10868 => '::=', 10869 => '==', 10870 => '===', 12288 => ' ', 12443 => ' ゙', 12444 => ' ゚', 12800 => '(ᄀ)', 12801 => '(ᄂ)', 12802 => '(ᄃ)', 12803 => '(ᄅ)', 12804 => '(ᄆ)', 12805 => '(ᄇ)', 12806 => '(ᄉ)', 12807 => '(ᄋ)', 12808 => '(ᄌ)', 12809 => '(ᄎ)', 12810 => '(ᄏ)', 12811 => '(ᄐ)', 12812 => '(ᄑ)', 12813 => '(ᄒ)', 12814 => '(가)', 12815 => '(나)', 12816 => '(다)', 12817 => '(라)', 12818 => '(마)', 12819 => '(바)', 12820 => '(사)', 12821 => '(아)', 12822 => '(자)', 12823 => '(차)', 12824 => '(카)', 12825 => '(타)', 12826 => '(파)', 12827 => '(하)', 12828 => '(주)', 12829 => '(오전)', 12830 => '(오후)', 12832 => '(一)', 12833 => '(二)', 12834 => '(三)', 12835 => '(四)', 12836 => '(五)', 12837 => '(六)', 12838 => '(七)', 12839 => '(八)', 12840 => '(九)', 12841 => '(十)', 12842 => '(月)', 12843 => '(火)', 12844 => '(水)', 12845 => '(木)', 12846 => '(金)', 12847 => '(土)', 12848 => '(日)', 12849 => '(株)', 12850 => '(有)', 12851 => '(社)', 12852 => '(名)', 12853 => '(特)', 12854 => '(財)', 12855 => '(祝)', 12856 => '(労)', 12857 => '(代)', 12858 => '(呼)', 12859 => '(学)', 12860 => '(監)', 12861 => '(企)', 12862 => '(資)', 12863 => '(協)', 12864 => '(祭)', 12865 => '(休)', 12866 => '(自)', 12867 => '(至)', 64297 => '+', 64606 => ' ٌّ', 64607 => ' ٍّ', 64608 => ' َّ', 64609 => ' ُّ', 64610 => ' ِّ', 64611 => ' ّٰ', 65018 => 'صلى الله عليه وسلم', 65019 => 'جل جلاله', 65040 => ',', 65043 => ':', 65044 => ';', 65045 => '!', 65046 => '?', 65075 => '_', 65076 => '_', 65077 => '(', 65078 => ')', 65079 => '{', 65080 => '}', 65095 => '[', 65096 => ']', 65097 => ' ̅', 65098 => ' ̅', 65099 => ' ̅', 65100 => ' ̅', 65101 => '_', 65102 => '_', 65103 => '_', 65104 => ',', 65108 => ';', 65109 => ':', 65110 => '?', 65111 => '!', 65113 => '(', 65114 => ')', 65115 => '{', 65116 => '}', 65119 => '#', 65120 => '&', 65121 => '*', 65122 => '+', 65124 => '<', 65125 => '>', 65126 => '=', 65128 => '\\', 65129 => '$', 65130 => '%', 65131 => '@', 65136 => ' ً', 65138 => ' ٌ', 65140 => ' ٍ', 65142 => ' َ', 65144 => ' ُ', 65146 => ' ِ', 65148 => ' ّ', 65150 => ' ْ', 65281 => '!', 65282 => '"', 65283 => '#', 65284 => '$', 65285 => '%', 65286 => '&', 65287 => '\'', 65288 => '(', 65289 => ')', 65290 => '*', 65291 => '+', 65292 => ',', 65295 => '/', 65306 => ':', 65307 => ';', 65308 => '<', 65309 => '=', 65310 => '>', 65311 => '?', 65312 => '@', 65339 => '[', 65340 => '\\', 65341 => ']', 65342 => '^', 65343 => '_', 65344 => '`', 65371 => '{', 65372 => '|', 65373 => '}', 65374 => '~', 65507 => ' ̄', 127233 => '0,', 127234 => '1,', 127235 => '2,', 127236 => '3,', 127237 => '4,', 127238 => '5,', 127239 => '6,', 127240 => '7,', 127241 => '8,', 127242 => '9,', 127248 => '(a)', 127249 => '(b)', 127250 => '(c)', 127251 => '(d)', 127252 => '(e)', 127253 => '(f)', 127254 => '(g)', 127255 => '(h)', 127256 => '(i)', 127257 => '(j)', 127258 => '(k)', 127259 => '(l)', 127260 => '(m)', 127261 => '(n)', 127262 => '(o)', 127263 => '(p)', 127264 => '(q)', 127265 => '(r)', 127266 => '(s)', 127267 => '(t)', 127268 => '(u)', 127269 => '(v)', 127270 => '(w)', 127271 => '(x)', 127272 => '(y)', 127273 => '(z)');
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
return array(0 => \true, 1 => \true, 2 => \true, 3 => \true, 4 => \true, 5 => \true, 6 => \true, 7 => \true, 8 => \true, 9 => \true, 10 => \true, 11 => \true, 12 => \true, 13 => \true, 14 => \true, 15 => \true, 16 => \true, 17 => \true, 18 => \true, 19 => \true, 20 => \true, 21 => \true, 22 => \true, 23 => \true, 24 => \true, 25 => \true, 26 => \true, 27 => \true, 28 => \true, 29 => \true, 30 => \true, 31 => \true, 32 => \true, 33 => \true, 34 => \true, 35 => \true, 36 => \true, 37 => \true, 38 => \true, 39 => \true, 40 => \true, 41 => \true, 42 => \true, 43 => \true, 44 => \true, 47 => \true, 58 => \true, 59 => \true, 60 => \true, 61 => \true, 62 => \true, 63 => \true, 64 => \true, 91 => \true, 92 => \true, 93 => \true, 94 => \true, 95 => \true, 96 => \true, 123 => \true, 124 => \true, 125 => \true, 126 => \true, 127 => \true, 8800 => \true, 8814 => \true, 8815 => \true);
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
return array(173 => \true, 847 => \true, 6155 => \true, 6156 => \true, 6157 => \true, 8203 => \true, 8288 => \true, 8292 => \true, 65024 => \true, 65025 => \true, 65026 => \true, 65027 => \true, 65028 => \true, 65029 => \true, 65030 => \true, 65031 => \true, 65032 => \true, 65033 => \true, 65034 => \true, 65035 => \true, 65036 => \true, 65037 => \true, 65038 => \true, 65039 => \true, 65279 => \true, 113824 => \true, 113825 => \true, 113826 => \true, 113827 => \true, 917760 => \true, 917761 => \true, 917762 => \true, 917763 => \true, 917764 => \true, 917765 => \true, 917766 => \true, 917767 => \true, 917768 => \true, 917769 => \true, 917770 => \true, 917771 => \true, 917772 => \true, 917773 => \true, 917774 => \true, 917775 => \true, 917776 => \true, 917777 => \true, 917778 => \true, 917779 => \true, 917780 => \true, 917781 => \true, 917782 => \true, 917783 => \true, 917784 => \true, 917785 => \true, 917786 => \true, 917787 => \true, 917788 => \true, 917789 => \true, 917790 => \true, 917791 => \true, 917792 => \true, 917793 => \true, 917794 => \true, 917795 => \true, 917796 => \true, 917797 => \true, 917798 => \true, 917799 => \true, 917800 => \true, 917801 => \true, 917802 => \true, 917803 => \true, 917804 => \true, 917805 => \true, 917806 => \true, 917807 => \true, 917808 => \true, 917809 => \true, 917810 => \true, 917811 => \true, 917812 => \true, 917813 => \true, 917814 => \true, 917815 => \true, 917816 => \true, 917817 => \true, 917818 => \true, 917819 => \true, 917820 => \true, 917821 => \true, 917822 => \true, 917823 => \true, 917824 => \true, 917825 => \true, 917826 => \true, 917827 => \true, 917828 => \true, 917829 => \true, 917830 => \true, 917831 => \true, 917832 => \true, 917833 => \true, 917834 => \true, 917835 => \true, 917836 => \true, 917837 => \true, 917838 => \true, 917839 => \true, 917840 => \true, 917841 => \true, 917842 => \true, 917843 => \true, 917844 => \true, 917845 => \true, 917846 => \true, 917847 => \true, 917848 => \true, 917849 => \true, 917850 => \true, 917851 => \true, 917852 => \true, 917853 => \true, 917854 => \true, 917855 => \true, 917856 => \true, 917857 => \true, 917858 => \true, 917859 => \true, 917860 => \true, 917861 => \true, 917862 => \true, 917863 => \true, 917864 => \true, 917865 => \true, 917866 => \true, 917867 => \true, 917868 => \true, 917869 => \true, 917870 => \true, 917871 => \true, 917872 => \true, 917873 => \true, 917874 => \true, 917875 => \true, 917876 => \true, 917877 => \true, 917878 => \true, 917879 => \true, 917880 => \true, 917881 => \true, 917882 => \true, 917883 => \true, 917884 => \true, 917885 => \true, 917886 => \true, 917887 => \true, 917888 => \true, 917889 => \true, 917890 => \true, 917891 => \true, 917892 => \true, 917893 => \true, 917894 => \true, 917895 => \true, 917896 => \true, 917897 => \true, 917898 => \true, 917899 => \true, 917900 => \true, 917901 => \true, 917902 => \true, 917903 => \true, 917904 => \true, 917905 => \true, 917906 => \true, 917907 => \true, 917908 => \true, 917909 => \true, 917910 => \true, 917911 => \true, 917912 => \true, 917913 => \true, 917914 => \true, 917915 => \true, 917916 => \true, 917917 => \true, 917918 => \true, 917919 => \true, 917920 => \true, 917921 => \true, 917922 => \true, 917923 => \true, 917924 => \true, 917925 => \true, 917926 => \true, 917927 => \true, 917928 => \true, 917929 => \true, 917930 => \true, 917931 => \true, 917932 => \true, 917933 => \true, 917934 => \true, 917935 => \true, 917936 => \true, 917937 => \true, 917938 => \true, 917939 => \true, 917940 => \true, 917941 => \true, 917942 => \true, 917943 => \true, 917944 => \true, 917945 => \true, 917946 => \true, 917947 => \true, 917948 => \true, 917949 => \true, 917950 => \true, 917951 => \true, 917952 => \true, 917953 => \true, 917954 => \true, 917955 => \true, 917956 => \true, 917957 => \true, 917958 => \true, 917959 => \true, 917960 => \true, 917961 => \true, 917962 => \true, 917963 => \true, 917964 => \true, 917965 => \true, 917966 => \true, 917967 => \true, 917968 => \true, 917969 => \true, 917970 => \true, 917971 => \true, 917972 => \true, 917973 => \true, 917974 => \true, 917975 => \true, 917976 => \true, 917977 => \true, 917978 => \true, 917979 => \true, 917980 => \true, 917981 => \true, 917982 => \true, 917983 => \true, 917984 => \true, 917985 => \true, 917986 => \true, 917987 => \true, 917988 => \true, 917989 => \true, 917990 => \true, 917991 => \true, 917992 => \true, 917993 => \true, 917994 => \true, 917995 => \true, 917996 => \true, 917997 => \true, 917998 => \true, 917999 => \true);
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
return array(2381 => 9, 2509 => 9, 2637 => 9, 2765 => 9, 2893 => 9, 3021 => 9, 3149 => 9, 3277 => 9, 3387 => 9, 3388 => 9, 3405 => 9, 3530 => 9, 3642 => 9, 3770 => 9, 3972 => 9, 4153 => 9, 4154 => 9, 5908 => 9, 5940 => 9, 6098 => 9, 6752 => 9, 6980 => 9, 7082 => 9, 7083 => 9, 7154 => 9, 7155 => 9, 11647 => 9, 43014 => 9, 43052 => 9, 43204 => 9, 43347 => 9, 43456 => 9, 43766 => 9, 44013 => 9, 68159 => 9, 69702 => 9, 69759 => 9, 69817 => 9, 69939 => 9, 69940 => 9, 70080 => 9, 70197 => 9, 70378 => 9, 70477 => 9, 70722 => 9, 70850 => 9, 71103 => 9, 71231 => 9, 71350 => 9, 71467 => 9, 71737 => 9, 71997 => 9, 71998 => 9, 72160 => 9, 72244 => 9, 72263 => 9, 72345 => 9, 72767 => 9, 73028 => 9, 73029 => 9, 73111 => 9);
|
||||
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
use VendorDuplicator\Symfony\Polyfill\Intl\Idn as p;
|
||||
if (\extension_loaded('intl')) {
|
||||
return;
|
||||
}
|
||||
if (!\defined('U_IDNA_PROHIBITED_ERROR')) {
|
||||
\define('U_IDNA_PROHIBITED_ERROR', 66560);
|
||||
}
|
||||
if (!\defined('U_IDNA_ERROR_START')) {
|
||||
\define('U_IDNA_ERROR_START', 66560);
|
||||
}
|
||||
if (!\defined('U_IDNA_UNASSIGNED_ERROR')) {
|
||||
\define('U_IDNA_UNASSIGNED_ERROR', 66561);
|
||||
}
|
||||
if (!\defined('U_IDNA_CHECK_BIDI_ERROR')) {
|
||||
\define('U_IDNA_CHECK_BIDI_ERROR', 66562);
|
||||
}
|
||||
if (!\defined('U_IDNA_STD3_ASCII_RULES_ERROR')) {
|
||||
\define('U_IDNA_STD3_ASCII_RULES_ERROR', 66563);
|
||||
}
|
||||
if (!\defined('U_IDNA_ACE_PREFIX_ERROR')) {
|
||||
\define('U_IDNA_ACE_PREFIX_ERROR', 66564);
|
||||
}
|
||||
if (!\defined('U_IDNA_VERIFICATION_ERROR')) {
|
||||
\define('U_IDNA_VERIFICATION_ERROR', 66565);
|
||||
}
|
||||
if (!\defined('U_IDNA_LABEL_TOO_LONG_ERROR')) {
|
||||
\define('U_IDNA_LABEL_TOO_LONG_ERROR', 66566);
|
||||
}
|
||||
if (!\defined('U_IDNA_ZERO_LENGTH_LABEL_ERROR')) {
|
||||
\define('U_IDNA_ZERO_LENGTH_LABEL_ERROR', 66567);
|
||||
}
|
||||
if (!\defined('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR')) {
|
||||
\define('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR', 66568);
|
||||
}
|
||||
if (!\defined('U_IDNA_ERROR_LIMIT')) {
|
||||
\define('U_IDNA_ERROR_LIMIT', 66569);
|
||||
}
|
||||
if (!\defined('U_STRINGPREP_PROHIBITED_ERROR')) {
|
||||
\define('U_STRINGPREP_PROHIBITED_ERROR', 66560);
|
||||
}
|
||||
if (!\defined('U_STRINGPREP_UNASSIGNED_ERROR')) {
|
||||
\define('U_STRINGPREP_UNASSIGNED_ERROR', 66561);
|
||||
}
|
||||
if (!\defined('U_STRINGPREP_CHECK_BIDI_ERROR')) {
|
||||
\define('U_STRINGPREP_CHECK_BIDI_ERROR', 66562);
|
||||
}
|
||||
if (!\defined('IDNA_DEFAULT')) {
|
||||
\define('IDNA_DEFAULT', 0);
|
||||
}
|
||||
if (!\defined('IDNA_ALLOW_UNASSIGNED')) {
|
||||
\define('IDNA_ALLOW_UNASSIGNED', 1);
|
||||
}
|
||||
if (!\defined('IDNA_USE_STD3_RULES')) {
|
||||
\define('IDNA_USE_STD3_RULES', 2);
|
||||
}
|
||||
if (!\defined('IDNA_CHECK_BIDI')) {
|
||||
\define('IDNA_CHECK_BIDI', 4);
|
||||
}
|
||||
if (!\defined('IDNA_CHECK_CONTEXTJ')) {
|
||||
\define('IDNA_CHECK_CONTEXTJ', 8);
|
||||
}
|
||||
if (!\defined('IDNA_NONTRANSITIONAL_TO_ASCII')) {
|
||||
\define('IDNA_NONTRANSITIONAL_TO_ASCII', 16);
|
||||
}
|
||||
if (!\defined('IDNA_NONTRANSITIONAL_TO_UNICODE')) {
|
||||
\define('IDNA_NONTRANSITIONAL_TO_UNICODE', 32);
|
||||
}
|
||||
if (!\defined('INTL_IDNA_VARIANT_2003')) {
|
||||
\define('INTL_IDNA_VARIANT_2003', 0);
|
||||
}
|
||||
if (!\defined('INTL_IDNA_VARIANT_UTS46')) {
|
||||
\define('INTL_IDNA_VARIANT_UTS46', 1);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_EMPTY_LABEL')) {
|
||||
\define('IDNA_ERROR_EMPTY_LABEL', 1);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_LABEL_TOO_LONG')) {
|
||||
\define('IDNA_ERROR_LABEL_TOO_LONG', 2);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_DOMAIN_NAME_TOO_LONG')) {
|
||||
\define('IDNA_ERROR_DOMAIN_NAME_TOO_LONG', 4);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_LEADING_HYPHEN')) {
|
||||
\define('IDNA_ERROR_LEADING_HYPHEN', 8);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_TRAILING_HYPHEN')) {
|
||||
\define('IDNA_ERROR_TRAILING_HYPHEN', 16);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_HYPHEN_3_4')) {
|
||||
\define('IDNA_ERROR_HYPHEN_3_4', 32);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_LEADING_COMBINING_MARK')) {
|
||||
\define('IDNA_ERROR_LEADING_COMBINING_MARK', 64);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_DISALLOWED')) {
|
||||
\define('IDNA_ERROR_DISALLOWED', 128);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_PUNYCODE')) {
|
||||
\define('IDNA_ERROR_PUNYCODE', 256);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_LABEL_HAS_DOT')) {
|
||||
\define('IDNA_ERROR_LABEL_HAS_DOT', 512);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_INVALID_ACE_LABEL')) {
|
||||
\define('IDNA_ERROR_INVALID_ACE_LABEL', 1024);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_BIDI')) {
|
||||
\define('IDNA_ERROR_BIDI', 2048);
|
||||
}
|
||||
if (!\defined('IDNA_ERROR_CONTEXTJ')) {
|
||||
\define('IDNA_ERROR_CONTEXTJ', 4096);
|
||||
}
|
||||
if (\PHP_VERSION_ID < 70400) {
|
||||
if (!\function_exists('idn_to_ascii')) {
|
||||
function idn_to_ascii($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_2003, &$idna_info = array())
|
||||
{
|
||||
return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('idn_to_utf8')) {
|
||||
function idn_to_utf8($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_2003, &$idna_info = array())
|
||||
{
|
||||
return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!\function_exists('idn_to_ascii')) {
|
||||
function idn_to_ascii($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_UTS46, &$idna_info = array())
|
||||
{
|
||||
return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('idn_to_utf8')) {
|
||||
function idn_to_utf8($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_UTS46, &$idna_info = array())
|
||||
{
|
||||
return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,257 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace VendorDuplicator\Symfony\Polyfill\Intl\Normalizer;
|
||||
|
||||
/**
|
||||
* Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension.
|
||||
*
|
||||
* It has been validated with Unicode 6.3 Normalization Conformance Test.
|
||||
* See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations.
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
class Normalizer
|
||||
{
|
||||
const FORM_D = \Normalizer::FORM_D;
|
||||
const FORM_KD = \Normalizer::FORM_KD;
|
||||
const FORM_C = \Normalizer::FORM_C;
|
||||
const FORM_KC = \Normalizer::FORM_KC;
|
||||
const NFD = \Normalizer::NFD;
|
||||
const NFKD = \Normalizer::NFKD;
|
||||
const NFC = \Normalizer::NFC;
|
||||
const NFKC = \Normalizer::NFKC;
|
||||
private static $C;
|
||||
private static $D;
|
||||
private static $KD;
|
||||
private static $cC;
|
||||
private static $ulenMask = array("\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4);
|
||||
private static $ASCII = " eiasntrolud][cmp'\ng|hv.fb,:=-q10C2*yx)(L9AS/P\"EjMIk3>5T<D4}B{8FwR67UGN;JzV#HOW_&!K?XQ%Y\\\tZ+~^\$@`\x00\x01\x02\x03\x04\x05\x06\x07\x08\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f";
|
||||
public static function isNormalized($s, $form = self::NFC)
|
||||
{
|
||||
if (!\in_array($form, array(self::NFD, self::NFKD, self::NFC, self::NFKC))) {
|
||||
return \false;
|
||||
}
|
||||
$s = (string) $s;
|
||||
if (!isset($s[\strspn($s, self::$ASCII)])) {
|
||||
return \true;
|
||||
}
|
||||
if (self::NFC == $form && \preg_match('//u', $s) && !\preg_match('/[^\\x00-\\x{2FF}]/u', $s)) {
|
||||
return \true;
|
||||
}
|
||||
return self::normalize($s, $form) === $s;
|
||||
}
|
||||
public static function normalize($s, $form = self::NFC)
|
||||
{
|
||||
$s = (string) $s;
|
||||
if (!\preg_match('//u', $s)) {
|
||||
return \false;
|
||||
}
|
||||
switch ($form) {
|
||||
case self::NFC:
|
||||
$C = \true;
|
||||
$K = \false;
|
||||
break;
|
||||
case self::NFD:
|
||||
$C = \false;
|
||||
$K = \false;
|
||||
break;
|
||||
case self::NFKC:
|
||||
$C = \true;
|
||||
$K = \true;
|
||||
break;
|
||||
case self::NFKD:
|
||||
$C = \false;
|
||||
$K = \true;
|
||||
break;
|
||||
default:
|
||||
if (\defined('Normalizer::NONE') && \Normalizer::NONE == $form) {
|
||||
return $s;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
if ('' === $s) {
|
||||
return '';
|
||||
}
|
||||
if ($K && null === self::$KD) {
|
||||
self::$KD = self::getData('compatibilityDecomposition');
|
||||
}
|
||||
if (null === self::$D) {
|
||||
self::$D = self::getData('canonicalDecomposition');
|
||||
self::$cC = self::getData('combiningClass');
|
||||
}
|
||||
if (null !== ($mbEncoding = 2 & (int) \ini_get('mbstring.func_overload') ? \mb_internal_encoding() : null)) {
|
||||
\mb_internal_encoding('8bit');
|
||||
}
|
||||
$r = self::decompose($s, $K);
|
||||
if ($C) {
|
||||
if (null === self::$C) {
|
||||
self::$C = self::getData('canonicalComposition');
|
||||
}
|
||||
$r = self::recompose($r);
|
||||
}
|
||||
if (null !== $mbEncoding) {
|
||||
\mb_internal_encoding($mbEncoding);
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
private static function recompose($s)
|
||||
{
|
||||
$ASCII = self::$ASCII;
|
||||
$compMap = self::$C;
|
||||
$combClass = self::$cC;
|
||||
$ulenMask = self::$ulenMask;
|
||||
$result = $tail = '';
|
||||
$i = $s[0] < "\x80" ? 1 : $ulenMask[$s[0] & "\xf0"];
|
||||
$len = \strlen($s);
|
||||
$lastUchr = \substr($s, 0, $i);
|
||||
$lastUcls = isset($combClass[$lastUchr]) ? 256 : 0;
|
||||
while ($i < $len) {
|
||||
if ($s[$i] < "\x80") {
|
||||
// ASCII chars
|
||||
if ($tail) {
|
||||
$lastUchr .= $tail;
|
||||
$tail = '';
|
||||
}
|
||||
if ($j = \strspn($s, $ASCII, $i + 1)) {
|
||||
$lastUchr .= \substr($s, $i, $j);
|
||||
$i += $j;
|
||||
}
|
||||
$result .= $lastUchr;
|
||||
$lastUchr = $s[$i];
|
||||
$lastUcls = 0;
|
||||
++$i;
|
||||
continue;
|
||||
}
|
||||
$ulen = $ulenMask[$s[$i] & "\xf0"];
|
||||
$uchr = \substr($s, $i, $ulen);
|
||||
if ($lastUchr < "ᄀ" || "ᄒ" < $lastUchr || $uchr < "ᅡ" || "ᅵ" < $uchr || $lastUcls) {
|
||||
// Table lookup and combining chars composition
|
||||
$ucls = isset($combClass[$uchr]) ? $combClass[$uchr] : 0;
|
||||
if (isset($compMap[$lastUchr . $uchr]) && (!$lastUcls || $lastUcls < $ucls)) {
|
||||
$lastUchr = $compMap[$lastUchr . $uchr];
|
||||
} elseif ($lastUcls = $ucls) {
|
||||
$tail .= $uchr;
|
||||
} else {
|
||||
if ($tail) {
|
||||
$lastUchr .= $tail;
|
||||
$tail = '';
|
||||
}
|
||||
$result .= $lastUchr;
|
||||
$lastUchr = $uchr;
|
||||
}
|
||||
} else {
|
||||
// Hangul chars
|
||||
$L = \ord($lastUchr[2]) - 0x80;
|
||||
$V = \ord($uchr[2]) - 0xa1;
|
||||
$T = 0;
|
||||
$uchr = \substr($s, $i + $ulen, 3);
|
||||
if ("ᆧ" <= $uchr && $uchr <= "ᇂ") {
|
||||
$T = \ord($uchr[2]) - 0xa7;
|
||||
0 > $T && ($T += 0x40);
|
||||
$ulen += 3;
|
||||
}
|
||||
$L = 0xac00 + ($L * 21 + $V) * 28 + $T;
|
||||
$lastUchr = \chr(0xe0 | $L >> 12) . \chr(0x80 | $L >> 6 & 0x3f) . \chr(0x80 | $L & 0x3f);
|
||||
}
|
||||
$i += $ulen;
|
||||
}
|
||||
return $result . $lastUchr . $tail;
|
||||
}
|
||||
private static function decompose($s, $c)
|
||||
{
|
||||
$result = '';
|
||||
$ASCII = self::$ASCII;
|
||||
$decompMap = self::$D;
|
||||
$combClass = self::$cC;
|
||||
$ulenMask = self::$ulenMask;
|
||||
if ($c) {
|
||||
$compatMap = self::$KD;
|
||||
}
|
||||
$c = array();
|
||||
$i = 0;
|
||||
$len = \strlen($s);
|
||||
while ($i < $len) {
|
||||
if ($s[$i] < "\x80") {
|
||||
// ASCII chars
|
||||
if ($c) {
|
||||
\ksort($c);
|
||||
$result .= \implode('', $c);
|
||||
$c = array();
|
||||
}
|
||||
$j = 1 + \strspn($s, $ASCII, $i + 1);
|
||||
$result .= \substr($s, $i, $j);
|
||||
$i += $j;
|
||||
continue;
|
||||
}
|
||||
$ulen = $ulenMask[$s[$i] & "\xf0"];
|
||||
$uchr = \substr($s, $i, $ulen);
|
||||
$i += $ulen;
|
||||
if ($uchr < "가" || "힣" < $uchr) {
|
||||
// Table lookup
|
||||
if ($uchr !== ($j = isset($compatMap[$uchr]) ? $compatMap[$uchr] : (isset($decompMap[$uchr]) ? $decompMap[$uchr] : $uchr))) {
|
||||
$uchr = $j;
|
||||
$j = \strlen($uchr);
|
||||
$ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xf0"];
|
||||
if ($ulen != $j) {
|
||||
// Put trailing chars in $s
|
||||
$j -= $ulen;
|
||||
$i -= $j;
|
||||
if (0 > $i) {
|
||||
$s = \str_repeat(' ', -$i) . $s;
|
||||
$len -= $i;
|
||||
$i = 0;
|
||||
}
|
||||
while ($j--) {
|
||||
$s[$i + $j] = $uchr[$ulen + $j];
|
||||
}
|
||||
$uchr = \substr($uchr, 0, $ulen);
|
||||
}
|
||||
}
|
||||
if (isset($combClass[$uchr])) {
|
||||
// Combining chars, for sorting
|
||||
if (!isset($c[$combClass[$uchr]])) {
|
||||
$c[$combClass[$uchr]] = '';
|
||||
}
|
||||
$c[$combClass[$uchr]] .= $uchr;
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
// Hangul chars
|
||||
$uchr = \unpack('C*', $uchr);
|
||||
$j = ($uchr[1] - 224 << 12) + ($uchr[2] - 128 << 6) + $uchr[3] - 0xac80;
|
||||
$uchr = "\xe1\x84" . \chr(0x80 + (int) ($j / 588)) . "\xe1\x85" . \chr(0xa1 + (int) ($j % 588 / 28));
|
||||
if ($j %= 28) {
|
||||
$uchr .= $j < 25 ? "\xe1\x86" . \chr(0xa7 + $j) : "\xe1\x87" . \chr(0x67 + $j);
|
||||
}
|
||||
}
|
||||
if ($c) {
|
||||
\ksort($c);
|
||||
$result .= \implode('', $c);
|
||||
$c = array();
|
||||
}
|
||||
$result .= $uchr;
|
||||
}
|
||||
if ($c) {
|
||||
\ksort($c);
|
||||
$result .= \implode('', $c);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
private static function getData($file)
|
||||
{
|
||||
if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) {
|
||||
return require $file;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
class Normalizer extends Symfony\Polyfill\Intl\Normalizer\Normalizer
|
||||
{
|
||||
/**
|
||||
* @deprecated since ICU 56 and removed in PHP 8
|
||||
*/
|
||||
const NONE = 1;
|
||||
const FORM_D = 2;
|
||||
const FORM_KD = 3;
|
||||
const FORM_C = 4;
|
||||
const FORM_KC = 5;
|
||||
const NFD = 2;
|
||||
const NFKD = 3;
|
||||
const NFC = 4;
|
||||
const NFKC = 5;
|
||||
}
|
||||
\class_alias('VendorDuplicator\\Normalizer', 'Normalizer', \false);
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
use VendorDuplicator\Symfony\Polyfill\Intl\Normalizer as p;
|
||||
if (!\function_exists('normalizer_is_normalized')) {
|
||||
function normalizer_is_normalized($input, $form = p\Normalizer::NFC)
|
||||
{
|
||||
return p\Normalizer::isNormalized($input, $form);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('normalizer_normalize')) {
|
||||
function normalizer_normalize($input, $form = p\Normalizer::NFC)
|
||||
{
|
||||
return p\Normalizer::normalize($input, $form);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,678 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace VendorDuplicator\Symfony\Polyfill\Mbstring;
|
||||
|
||||
/**
|
||||
* Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
|
||||
*
|
||||
* Implemented:
|
||||
* - mb_chr - Returns a specific character from its Unicode code point
|
||||
* - mb_convert_encoding - Convert character encoding
|
||||
* - mb_convert_variables - Convert character code in variable(s)
|
||||
* - mb_decode_mimeheader - Decode string in MIME header field
|
||||
* - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
|
||||
* - mb_decode_numericentity - Decode HTML numeric string reference to character
|
||||
* - mb_encode_numericentity - Encode character to HTML numeric string reference
|
||||
* - mb_convert_case - Perform case folding on a string
|
||||
* - mb_detect_encoding - Detect character encoding
|
||||
* - mb_get_info - Get internal settings of mbstring
|
||||
* - mb_http_input - Detect HTTP input character encoding
|
||||
* - mb_http_output - Set/Get HTTP output character encoding
|
||||
* - mb_internal_encoding - Set/Get internal character encoding
|
||||
* - mb_list_encodings - Returns an array of all supported encodings
|
||||
* - mb_ord - Returns the Unicode code point of a character
|
||||
* - mb_output_handler - Callback function converts character encoding in output buffer
|
||||
* - mb_scrub - Replaces ill-formed byte sequences with substitute characters
|
||||
* - mb_strlen - Get string length
|
||||
* - mb_strpos - Find position of first occurrence of string in a string
|
||||
* - mb_strrpos - Find position of last occurrence of a string in a string
|
||||
* - mb_str_split - Convert a string to an array
|
||||
* - mb_strtolower - Make a string lowercase
|
||||
* - mb_strtoupper - Make a string uppercase
|
||||
* - mb_substitute_character - Set/Get substitution character
|
||||
* - mb_substr - Get part of string
|
||||
* - mb_stripos - Finds position of first occurrence of a string within another, case insensitive
|
||||
* - mb_stristr - Finds first occurrence of a string within another, case insensitive
|
||||
* - mb_strrchr - Finds the last occurrence of a character in a string within another
|
||||
* - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive
|
||||
* - mb_strripos - Finds position of last occurrence of a string within another, case insensitive
|
||||
* - mb_strstr - Finds first occurrence of a string within another
|
||||
* - mb_strwidth - Return width of string
|
||||
* - mb_substr_count - Count the number of substring occurrences
|
||||
*
|
||||
* Not implemented:
|
||||
* - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
|
||||
* - mb_ereg_* - Regular expression with multibyte support
|
||||
* - mb_parse_str - Parse GET/POST/COOKIE data and set global variable
|
||||
* - mb_preferred_mime_name - Get MIME charset string
|
||||
* - mb_regex_encoding - Returns current encoding for multibyte regex as string
|
||||
* - mb_regex_set_options - Set/Get the default options for mbregex functions
|
||||
* - mb_send_mail - Send encoded mail
|
||||
* - mb_split - Split multibyte string using regular expression
|
||||
* - mb_strcut - Get part of string
|
||||
* - mb_strimwidth - Get truncated string with specified width
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
final class Mbstring
|
||||
{
|
||||
const MB_CASE_FOLD = \PHP_INT_MAX;
|
||||
private static $encodingList = array('ASCII', 'UTF-8');
|
||||
private static $language = 'neutral';
|
||||
private static $internalEncoding = 'UTF-8';
|
||||
private static $caseFold = array(array('µ', 'ſ', "ͅ", 'ς', "ϐ", "ϑ", "ϕ", "ϖ", "ϰ", "ϱ", "ϵ", "ẛ", "ι"), array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "ṡ", 'ι'));
|
||||
public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
|
||||
{
|
||||
if (\is_array($fromEncoding) || \false !== \strpos($fromEncoding, ',')) {
|
||||
$fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
|
||||
} else {
|
||||
$fromEncoding = self::getEncoding($fromEncoding);
|
||||
}
|
||||
$toEncoding = self::getEncoding($toEncoding);
|
||||
if ('BASE64' === $fromEncoding) {
|
||||
$s = \base64_decode($s);
|
||||
$fromEncoding = $toEncoding;
|
||||
}
|
||||
if ('BASE64' === $toEncoding) {
|
||||
return \base64_encode($s);
|
||||
}
|
||||
if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
|
||||
if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
|
||||
$fromEncoding = 'Windows-1252';
|
||||
}
|
||||
if ('UTF-8' !== $fromEncoding) {
|
||||
$s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s);
|
||||
}
|
||||
return \preg_replace_callback('/[\\x80-\\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
|
||||
}
|
||||
if ('HTML-ENTITIES' === $fromEncoding) {
|
||||
$s = \html_entity_decode($s, \ENT_COMPAT, 'UTF-8');
|
||||
$fromEncoding = 'UTF-8';
|
||||
}
|
||||
return \iconv($fromEncoding, $toEncoding . '//IGNORE', $s);
|
||||
}
|
||||
public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
|
||||
{
|
||||
$vars = array(&$a, &$b, &$c, &$d, &$e, &$f);
|
||||
$ok = \true;
|
||||
\array_walk_recursive($vars, function (&$v) use(&$ok, $toEncoding, $fromEncoding) {
|
||||
if (\false === ($v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding))) {
|
||||
$ok = \false;
|
||||
}
|
||||
});
|
||||
return $ok ? $fromEncoding : \false;
|
||||
}
|
||||
public static function mb_decode_mimeheader($s)
|
||||
{
|
||||
return \iconv_mime_decode($s, 2, self::$internalEncoding);
|
||||
}
|
||||
public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
|
||||
{
|
||||
\trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING);
|
||||
}
|
||||
public static function mb_decode_numericentity($s, $convmap, $encoding = null)
|
||||
{
|
||||
if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
|
||||
\trigger_error('mb_decode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING);
|
||||
return null;
|
||||
}
|
||||
if (!\is_array($convmap) || !$convmap) {
|
||||
return \false;
|
||||
}
|
||||
if (null !== $encoding && !\is_scalar($encoding)) {
|
||||
\trigger_error('mb_decode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING);
|
||||
return '';
|
||||
// Instead of null (cf. mb_encode_numericentity).
|
||||
}
|
||||
$s = (string) $s;
|
||||
if ('' === $s) {
|
||||
return '';
|
||||
}
|
||||
$encoding = self::getEncoding($encoding);
|
||||
if ('UTF-8' === $encoding) {
|
||||
$encoding = null;
|
||||
if (!\preg_match('//u', $s)) {
|
||||
$s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s);
|
||||
}
|
||||
} else {
|
||||
$s = \iconv($encoding, 'UTF-8//IGNORE', $s);
|
||||
}
|
||||
$cnt = \floor(\count($convmap) / 4) * 4;
|
||||
for ($i = 0; $i < $cnt; $i += 4) {
|
||||
// collector_decode_htmlnumericentity ignores $convmap[$i + 3]
|
||||
$convmap[$i] += $convmap[$i + 2];
|
||||
$convmap[$i + 1] += $convmap[$i + 2];
|
||||
}
|
||||
$s = \preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use($cnt, $convmap) {
|
||||
$c = isset($m[2]) ? (int) \hexdec($m[2]) : $m[1];
|
||||
for ($i = 0; $i < $cnt; $i += 4) {
|
||||
if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
|
||||
return Mbstring::mb_chr($c - $convmap[$i + 2]);
|
||||
}
|
||||
}
|
||||
return $m[0];
|
||||
}, $s);
|
||||
if (null === $encoding) {
|
||||
return $s;
|
||||
}
|
||||
return \iconv('UTF-8', $encoding . '//IGNORE', $s);
|
||||
}
|
||||
public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = \false)
|
||||
{
|
||||
if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
|
||||
\trigger_error('mb_encode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING);
|
||||
return null;
|
||||
}
|
||||
if (!\is_array($convmap) || !$convmap) {
|
||||
return \false;
|
||||
}
|
||||
if (null !== $encoding && !\is_scalar($encoding)) {
|
||||
\trigger_error('mb_encode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING);
|
||||
return null;
|
||||
// Instead of '' (cf. mb_decode_numericentity).
|
||||
}
|
||||
if (null !== $is_hex && !\is_scalar($is_hex)) {
|
||||
\trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, ' . \gettype($s) . ' given', \E_USER_WARNING);
|
||||
return null;
|
||||
}
|
||||
$s = (string) $s;
|
||||
if ('' === $s) {
|
||||
return '';
|
||||
}
|
||||
$encoding = self::getEncoding($encoding);
|
||||
if ('UTF-8' === $encoding) {
|
||||
$encoding = null;
|
||||
if (!\preg_match('//u', $s)) {
|
||||
$s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s);
|
||||
}
|
||||
} else {
|
||||
$s = \iconv($encoding, 'UTF-8//IGNORE', $s);
|
||||
}
|
||||
static $ulenMask = array("\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4);
|
||||
$cnt = \floor(\count($convmap) / 4) * 4;
|
||||
$i = 0;
|
||||
$len = \strlen($s);
|
||||
$result = '';
|
||||
while ($i < $len) {
|
||||
$ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"];
|
||||
$uchr = \substr($s, $i, $ulen);
|
||||
$i += $ulen;
|
||||
$c = self::mb_ord($uchr);
|
||||
for ($j = 0; $j < $cnt; $j += 4) {
|
||||
if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {
|
||||
$cOffset = $c + $convmap[$j + 2] & $convmap[$j + 3];
|
||||
$result .= $is_hex ? \sprintf('&#x%X;', $cOffset) : '&#' . $cOffset . ';';
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
$result .= $uchr;
|
||||
}
|
||||
if (null === $encoding) {
|
||||
return $result;
|
||||
}
|
||||
return \iconv('UTF-8', $encoding . '//IGNORE', $result);
|
||||
}
|
||||
public static function mb_convert_case($s, $mode, $encoding = null)
|
||||
{
|
||||
$s = (string) $s;
|
||||
if ('' === $s) {
|
||||
return '';
|
||||
}
|
||||
$encoding = self::getEncoding($encoding);
|
||||
if ('UTF-8' === $encoding) {
|
||||
$encoding = null;
|
||||
if (!\preg_match('//u', $s)) {
|
||||
$s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s);
|
||||
}
|
||||
} else {
|
||||
$s = \iconv($encoding, 'UTF-8//IGNORE', $s);
|
||||
}
|
||||
if (\MB_CASE_TITLE == $mode) {
|
||||
static $titleRegexp = null;
|
||||
if (null === $titleRegexp) {
|
||||
$titleRegexp = self::getData('titleCaseRegexp');
|
||||
}
|
||||
$s = \preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s);
|
||||
} else {
|
||||
if (\MB_CASE_UPPER == $mode) {
|
||||
static $upper = null;
|
||||
if (null === $upper) {
|
||||
$upper = self::getData('upperCase');
|
||||
}
|
||||
$map = $upper;
|
||||
} else {
|
||||
if (self::MB_CASE_FOLD === $mode) {
|
||||
$s = \str_replace(self::$caseFold[0], self::$caseFold[1], $s);
|
||||
}
|
||||
static $lower = null;
|
||||
if (null === $lower) {
|
||||
$lower = self::getData('lowerCase');
|
||||
}
|
||||
$map = $lower;
|
||||
}
|
||||
static $ulenMask = array("\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4);
|
||||
$i = 0;
|
||||
$len = \strlen($s);
|
||||
while ($i < $len) {
|
||||
$ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"];
|
||||
$uchr = \substr($s, $i, $ulen);
|
||||
$i += $ulen;
|
||||
if (isset($map[$uchr])) {
|
||||
$uchr = $map[$uchr];
|
||||
$nlen = \strlen($uchr);
|
||||
if ($nlen == $ulen) {
|
||||
$nlen = $i;
|
||||
do {
|
||||
$s[--$nlen] = $uchr[--$ulen];
|
||||
} while ($ulen);
|
||||
} else {
|
||||
$s = \substr_replace($s, $uchr, $i - $ulen, $ulen);
|
||||
$len += $nlen - $ulen;
|
||||
$i += $nlen - $ulen;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (null === $encoding) {
|
||||
return $s;
|
||||
}
|
||||
return \iconv('UTF-8', $encoding . '//IGNORE', $s);
|
||||
}
|
||||
public static function mb_internal_encoding($encoding = null)
|
||||
{
|
||||
if (null === $encoding) {
|
||||
return self::$internalEncoding;
|
||||
}
|
||||
$encoding = self::getEncoding($encoding);
|
||||
if ('UTF-8' === $encoding || \false !== @\iconv($encoding, $encoding, ' ')) {
|
||||
self::$internalEncoding = $encoding;
|
||||
return \true;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
public static function mb_language($lang = null)
|
||||
{
|
||||
if (null === $lang) {
|
||||
return self::$language;
|
||||
}
|
||||
switch ($lang = \strtolower($lang)) {
|
||||
case 'uni':
|
||||
case 'neutral':
|
||||
self::$language = $lang;
|
||||
return \true;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
public static function mb_list_encodings()
|
||||
{
|
||||
return array('UTF-8');
|
||||
}
|
||||
public static function mb_encoding_aliases($encoding)
|
||||
{
|
||||
switch (\strtoupper($encoding)) {
|
||||
case 'UTF8':
|
||||
case 'UTF-8':
|
||||
return array('utf8');
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
public static function mb_check_encoding($var = null, $encoding = null)
|
||||
{
|
||||
if (null === $encoding) {
|
||||
if (null === $var) {
|
||||
return \false;
|
||||
}
|
||||
$encoding = self::$internalEncoding;
|
||||
}
|
||||
return self::mb_detect_encoding($var, array($encoding)) || \false !== @\iconv($encoding, $encoding, $var);
|
||||
}
|
||||
public static function mb_detect_encoding($str, $encodingList = null, $strict = \false)
|
||||
{
|
||||
if (null === $encodingList) {
|
||||
$encodingList = self::$encodingList;
|
||||
} else {
|
||||
if (!\is_array($encodingList)) {
|
||||
$encodingList = \array_map('trim', \explode(',', $encodingList));
|
||||
}
|
||||
$encodingList = \array_map('strtoupper', $encodingList);
|
||||
}
|
||||
foreach ($encodingList as $enc) {
|
||||
switch ($enc) {
|
||||
case 'ASCII':
|
||||
if (!\preg_match('/[\\x80-\\xFF]/', $str)) {
|
||||
return $enc;
|
||||
}
|
||||
break;
|
||||
case 'UTF8':
|
||||
case 'UTF-8':
|
||||
if (\preg_match('//u', $str)) {
|
||||
return 'UTF-8';
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (0 === \strncmp($enc, 'ISO-8859-', 9)) {
|
||||
return $enc;
|
||||
}
|
||||
}
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
public static function mb_detect_order($encodingList = null)
|
||||
{
|
||||
if (null === $encodingList) {
|
||||
return self::$encodingList;
|
||||
}
|
||||
if (!\is_array($encodingList)) {
|
||||
$encodingList = \array_map('trim', \explode(',', $encodingList));
|
||||
}
|
||||
$encodingList = \array_map('strtoupper', $encodingList);
|
||||
foreach ($encodingList as $enc) {
|
||||
switch ($enc) {
|
||||
default:
|
||||
if (\strncmp($enc, 'ISO-8859-', 9)) {
|
||||
return \false;
|
||||
}
|
||||
// no break
|
||||
case 'ASCII':
|
||||
case 'UTF8':
|
||||
case 'UTF-8':
|
||||
}
|
||||
}
|
||||
self::$encodingList = $encodingList;
|
||||
return \true;
|
||||
}
|
||||
public static function mb_strlen($s, $encoding = null)
|
||||
{
|
||||
$encoding = self::getEncoding($encoding);
|
||||
if ('CP850' === $encoding || 'ASCII' === $encoding) {
|
||||
return \strlen($s);
|
||||
}
|
||||
return @\iconv_strlen($s, $encoding);
|
||||
}
|
||||
public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
|
||||
{
|
||||
$encoding = self::getEncoding($encoding);
|
||||
if ('CP850' === $encoding || 'ASCII' === $encoding) {
|
||||
return \strpos($haystack, $needle, $offset);
|
||||
}
|
||||
$needle = (string) $needle;
|
||||
if ('' === $needle) {
|
||||
\trigger_error(__METHOD__ . ': Empty delimiter', \E_USER_WARNING);
|
||||
return \false;
|
||||
}
|
||||
return \iconv_strpos($haystack, $needle, $offset, $encoding);
|
||||
}
|
||||
public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
|
||||
{
|
||||
$encoding = self::getEncoding($encoding);
|
||||
if ('CP850' === $encoding || 'ASCII' === $encoding) {
|
||||
return \strrpos($haystack, $needle, $offset);
|
||||
}
|
||||
if ($offset != (int) $offset) {
|
||||
$offset = 0;
|
||||
} elseif ($offset = (int) $offset) {
|
||||
if ($offset < 0) {
|
||||
if (0 > ($offset += self::mb_strlen($needle))) {
|
||||
$haystack = self::mb_substr($haystack, 0, $offset, $encoding);
|
||||
}
|
||||
$offset = 0;
|
||||
} else {
|
||||
$haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
|
||||
}
|
||||
}
|
||||
$pos = \iconv_strrpos($haystack, $needle, $encoding);
|
||||
return \false !== $pos ? $offset + $pos : \false;
|
||||
}
|
||||
public static function mb_str_split($string, $split_length = 1, $encoding = null)
|
||||
{
|
||||
if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) {
|
||||
\trigger_error('mb_str_split() expects parameter 1 to be string, ' . \gettype($string) . ' given', \E_USER_WARNING);
|
||||
return null;
|
||||
}
|
||||
if (1 > ($split_length = (int) $split_length)) {
|
||||
\trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING);
|
||||
return \false;
|
||||
}
|
||||
if (null === $encoding) {
|
||||
$encoding = \mb_internal_encoding();
|
||||
}
|
||||
if ('UTF-8' === ($encoding = self::getEncoding($encoding))) {
|
||||
$rx = '/(';
|
||||
while (65535 < $split_length) {
|
||||
$rx .= '.{65535}';
|
||||
$split_length -= 65535;
|
||||
}
|
||||
$rx .= '.{' . $split_length . '})/us';
|
||||
return \preg_split($rx, $string, null, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY);
|
||||
}
|
||||
$result = array();
|
||||
$length = \mb_strlen($string, $encoding);
|
||||
for ($i = 0; $i < $length; $i += $split_length) {
|
||||
$result[] = \mb_substr($string, $i, $split_length, $encoding);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
public static function mb_strtolower($s, $encoding = null)
|
||||
{
|
||||
return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding);
|
||||
}
|
||||
public static function mb_strtoupper($s, $encoding = null)
|
||||
{
|
||||
return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding);
|
||||
}
|
||||
public static function mb_substitute_character($c = null)
|
||||
{
|
||||
if (0 === \strcasecmp($c, 'none')) {
|
||||
return \true;
|
||||
}
|
||||
return null !== $c ? \false : 'none';
|
||||
}
|
||||
public static function mb_substr($s, $start, $length = null, $encoding = null)
|
||||
{
|
||||
$encoding = self::getEncoding($encoding);
|
||||
if ('CP850' === $encoding || 'ASCII' === $encoding) {
|
||||
return (string) \substr($s, $start, null === $length ? 2147483647 : $length);
|
||||
}
|
||||
if ($start < 0) {
|
||||
$start = \iconv_strlen($s, $encoding) + $start;
|
||||
if ($start < 0) {
|
||||
$start = 0;
|
||||
}
|
||||
}
|
||||
if (null === $length) {
|
||||
$length = 2147483647;
|
||||
} elseif ($length < 0) {
|
||||
$length = \iconv_strlen($s, $encoding) + $length - $start;
|
||||
if ($length < 0) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
return (string) \iconv_substr($s, $start, $length, $encoding);
|
||||
}
|
||||
public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
|
||||
{
|
||||
$haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
|
||||
$needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
|
||||
return self::mb_strpos($haystack, $needle, $offset, $encoding);
|
||||
}
|
||||
public static function mb_stristr($haystack, $needle, $part = \false, $encoding = null)
|
||||
{
|
||||
$pos = self::mb_stripos($haystack, $needle, 0, $encoding);
|
||||
return self::getSubpart($pos, $part, $haystack, $encoding);
|
||||
}
|
||||
public static function mb_strrchr($haystack, $needle, $part = \false, $encoding = null)
|
||||
{
|
||||
$encoding = self::getEncoding($encoding);
|
||||
if ('CP850' === $encoding || 'ASCII' === $encoding) {
|
||||
$pos = \strrpos($haystack, $needle);
|
||||
} else {
|
||||
$needle = self::mb_substr($needle, 0, 1, $encoding);
|
||||
$pos = \iconv_strrpos($haystack, $needle, $encoding);
|
||||
}
|
||||
return self::getSubpart($pos, $part, $haystack, $encoding);
|
||||
}
|
||||
public static function mb_strrichr($haystack, $needle, $part = \false, $encoding = null)
|
||||
{
|
||||
$needle = self::mb_substr($needle, 0, 1, $encoding);
|
||||
$pos = self::mb_strripos($haystack, $needle, $encoding);
|
||||
return self::getSubpart($pos, $part, $haystack, $encoding);
|
||||
}
|
||||
public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
|
||||
{
|
||||
$haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
|
||||
$needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
|
||||
return self::mb_strrpos($haystack, $needle, $offset, $encoding);
|
||||
}
|
||||
public static function mb_strstr($haystack, $needle, $part = \false, $encoding = null)
|
||||
{
|
||||
$pos = \strpos($haystack, $needle);
|
||||
if (\false === $pos) {
|
||||
return \false;
|
||||
}
|
||||
if ($part) {
|
||||
return \substr($haystack, 0, $pos);
|
||||
}
|
||||
return \substr($haystack, $pos);
|
||||
}
|
||||
public static function mb_get_info($type = 'all')
|
||||
{
|
||||
$info = array('internal_encoding' => self::$internalEncoding, 'http_output' => 'pass', 'http_output_conv_mimetypes' => '^(text/|application/xhtml\\+xml)', 'func_overload' => 0, 'func_overload_list' => 'no overload', 'mail_charset' => 'UTF-8', 'mail_header_encoding' => 'BASE64', 'mail_body_encoding' => 'BASE64', 'illegal_chars' => 0, 'encoding_translation' => 'Off', 'language' => self::$language, 'detect_order' => self::$encodingList, 'substitute_character' => 'none', 'strict_detection' => 'Off');
|
||||
if ('all' === $type) {
|
||||
return $info;
|
||||
}
|
||||
if (isset($info[$type])) {
|
||||
return $info[$type];
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
public static function mb_http_input($type = '')
|
||||
{
|
||||
return \false;
|
||||
}
|
||||
public static function mb_http_output($encoding = null)
|
||||
{
|
||||
return null !== $encoding ? 'pass' === $encoding : 'pass';
|
||||
}
|
||||
public static function mb_strwidth($s, $encoding = null)
|
||||
{
|
||||
$encoding = self::getEncoding($encoding);
|
||||
if ('UTF-8' !== $encoding) {
|
||||
$s = \iconv($encoding, 'UTF-8//IGNORE', $s);
|
||||
}
|
||||
$s = \preg_replace('/[\\x{1100}-\\x{115F}\\x{2329}\\x{232A}\\x{2E80}-\\x{303E}\\x{3040}-\\x{A4CF}\\x{AC00}-\\x{D7A3}\\x{F900}-\\x{FAFF}\\x{FE10}-\\x{FE19}\\x{FE30}-\\x{FE6F}\\x{FF00}-\\x{FF60}\\x{FFE0}-\\x{FFE6}\\x{20000}-\\x{2FFFD}\\x{30000}-\\x{3FFFD}]/u', '', $s, -1, $wide);
|
||||
return ($wide << 1) + \iconv_strlen($s, 'UTF-8');
|
||||
}
|
||||
public static function mb_substr_count($haystack, $needle, $encoding = null)
|
||||
{
|
||||
return \substr_count($haystack, $needle);
|
||||
}
|
||||
public static function mb_output_handler($contents, $status)
|
||||
{
|
||||
return $contents;
|
||||
}
|
||||
public static function mb_chr($code, $encoding = null)
|
||||
{
|
||||
if (0x80 > ($code %= 0x200000)) {
|
||||
$s = \chr($code);
|
||||
} elseif (0x800 > $code) {
|
||||
$s = \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f);
|
||||
} elseif (0x10000 > $code) {
|
||||
$s = \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f);
|
||||
} else {
|
||||
$s = \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f);
|
||||
}
|
||||
if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) {
|
||||
$s = \mb_convert_encoding($s, $encoding, 'UTF-8');
|
||||
}
|
||||
return $s;
|
||||
}
|
||||
public static function mb_ord($s, $encoding = null)
|
||||
{
|
||||
if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) {
|
||||
$s = \mb_convert_encoding($s, 'UTF-8', $encoding);
|
||||
}
|
||||
if (1 === \strlen($s)) {
|
||||
return \ord($s);
|
||||
}
|
||||
$code = ($s = \unpack('C*', \substr($s, 0, 4))) ? $s[1] : 0;
|
||||
if (0xf0 <= $code) {
|
||||
return ($code - 0xf0 << 18) + ($s[2] - 0x80 << 12) + ($s[3] - 0x80 << 6) + $s[4] - 0x80;
|
||||
}
|
||||
if (0xe0 <= $code) {
|
||||
return ($code - 0xe0 << 12) + ($s[2] - 0x80 << 6) + $s[3] - 0x80;
|
||||
}
|
||||
if (0xc0 <= $code) {
|
||||
return ($code - 0xc0 << 6) + $s[2] - 0x80;
|
||||
}
|
||||
return $code;
|
||||
}
|
||||
private static function getSubpart($pos, $part, $haystack, $encoding)
|
||||
{
|
||||
if (\false === $pos) {
|
||||
return \false;
|
||||
}
|
||||
if ($part) {
|
||||
return self::mb_substr($haystack, 0, $pos, $encoding);
|
||||
}
|
||||
return self::mb_substr($haystack, $pos, null, $encoding);
|
||||
}
|
||||
private static function html_encoding_callback(array $m)
|
||||
{
|
||||
$i = 1;
|
||||
$entities = '';
|
||||
$m = \unpack('C*', \htmlentities($m[0], \ENT_COMPAT, 'UTF-8'));
|
||||
while (isset($m[$i])) {
|
||||
if (0x80 > $m[$i]) {
|
||||
$entities .= \chr($m[$i++]);
|
||||
continue;
|
||||
}
|
||||
if (0xf0 <= $m[$i]) {
|
||||
$c = ($m[$i++] - 0xf0 << 18) + ($m[$i++] - 0x80 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80;
|
||||
} elseif (0xe0 <= $m[$i]) {
|
||||
$c = ($m[$i++] - 0xe0 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80;
|
||||
} else {
|
||||
$c = ($m[$i++] - 0xc0 << 6) + $m[$i++] - 0x80;
|
||||
}
|
||||
$entities .= '&#' . $c . ';';
|
||||
}
|
||||
return $entities;
|
||||
}
|
||||
private static function title_case(array $s)
|
||||
{
|
||||
return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8') . self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8');
|
||||
}
|
||||
private static function getData($file)
|
||||
{
|
||||
if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) {
|
||||
return require $file;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
private static function getEncoding($encoding)
|
||||
{
|
||||
if (null === $encoding) {
|
||||
return self::$internalEncoding;
|
||||
}
|
||||
if ('UTF-8' === $encoding) {
|
||||
return 'UTF-8';
|
||||
}
|
||||
$encoding = \strtoupper($encoding);
|
||||
if ('8BIT' === $encoding || 'BINARY' === $encoding) {
|
||||
return 'CP850';
|
||||
}
|
||||
if ('UTF8' === $encoding) {
|
||||
return 'UTF-8';
|
||||
}
|
||||
return $encoding;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
use Symfony\Polyfill\Mbstring as p;
|
||||
|
||||
if (!function_exists('mb_convert_variables')) {
|
||||
/**
|
||||
* Convert character code in variable(s)
|
||||
*/
|
||||
function mb_convert_variables($to_encoding, $from_encoding, &$var, &...$vars)
|
||||
{
|
||||
$vars = [&$var, ...$vars];
|
||||
|
||||
$ok = true;
|
||||
array_walk_recursive($vars, function (&$v) use (&$ok, $to_encoding, $from_encoding) {
|
||||
if (false === $v = p\Mbstring::mb_convert_encoding($v, $to_encoding, $from_encoding)) {
|
||||
$ok = false;
|
||||
}
|
||||
});
|
||||
|
||||
return $ok ? $from_encoding : false;
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,256 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
use VendorDuplicator\Symfony\Polyfill\Mbstring as p;
|
||||
if (!\function_exists('mb_convert_encoding')) {
|
||||
function mb_convert_encoding($string, $to_encoding, $from_encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_decode_mimeheader')) {
|
||||
function mb_decode_mimeheader($string)
|
||||
{
|
||||
return p\Mbstring::mb_decode_mimeheader($string);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_encode_mimeheader')) {
|
||||
function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = null, $indent = null)
|
||||
{
|
||||
return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_decode_numericentity')) {
|
||||
function mb_decode_numericentity($string, $map, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_decode_numericentity($string, $map, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_encode_numericentity')) {
|
||||
function mb_encode_numericentity($string, $map, $encoding = null, $hex = \false)
|
||||
{
|
||||
return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_convert_case')) {
|
||||
function mb_convert_case($string, $mode, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_convert_case($string, $mode, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_internal_encoding')) {
|
||||
function mb_internal_encoding($encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_internal_encoding($encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_language')) {
|
||||
function mb_language($language = null)
|
||||
{
|
||||
return p\Mbstring::mb_language($language);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_list_encodings')) {
|
||||
function mb_list_encodings()
|
||||
{
|
||||
return p\Mbstring::mb_list_encodings();
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_encoding_aliases')) {
|
||||
function mb_encoding_aliases($encoding)
|
||||
{
|
||||
return p\Mbstring::mb_encoding_aliases($encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_check_encoding')) {
|
||||
function mb_check_encoding($value = null, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_check_encoding($value, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_detect_encoding')) {
|
||||
function mb_detect_encoding($string, $encodings = null, $strict = \false)
|
||||
{
|
||||
return p\Mbstring::mb_detect_encoding($string, $encodings, $strict);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_detect_order')) {
|
||||
function mb_detect_order($encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_detect_order($encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_parse_str')) {
|
||||
function mb_parse_str($string, &$result = array())
|
||||
{
|
||||
\parse_str($string, $result);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_strlen')) {
|
||||
function mb_strlen($string, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_strlen($string, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_strpos')) {
|
||||
function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_strtolower')) {
|
||||
function mb_strtolower($string, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_strtolower($string, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_strtoupper')) {
|
||||
function mb_strtoupper($string, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_strtoupper($string, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_substitute_character')) {
|
||||
function mb_substitute_character($substitute_character = null)
|
||||
{
|
||||
return p\Mbstring::mb_substitute_character($substitute_character);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_substr')) {
|
||||
function mb_substr($string, $start, $length = 2147483647, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_substr($string, $start, $length, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_stripos')) {
|
||||
function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_stristr')) {
|
||||
function mb_stristr($haystack, $needle, $before_needle = \false, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_strrchr')) {
|
||||
function mb_strrchr($haystack, $needle, $before_needle = \false, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_strrichr')) {
|
||||
function mb_strrichr($haystack, $needle, $before_needle = \false, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_strripos')) {
|
||||
function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_strrpos')) {
|
||||
function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_strstr')) {
|
||||
function mb_strstr($haystack, $needle, $before_needle = \false, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_get_info')) {
|
||||
function mb_get_info($type = 'all')
|
||||
{
|
||||
return p\Mbstring::mb_get_info($type);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_http_output')) {
|
||||
function mb_http_output($encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_http_output($encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_strwidth')) {
|
||||
function mb_strwidth($string, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_strwidth($string, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_substr_count')) {
|
||||
function mb_substr_count($haystack, $needle, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_substr_count($haystack, $needle, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_output_handler')) {
|
||||
function mb_output_handler($string, $status)
|
||||
{
|
||||
return p\Mbstring::mb_output_handler($string, $status);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_http_input')) {
|
||||
function mb_http_input($type = '')
|
||||
{
|
||||
return p\Mbstring::mb_http_input($type);
|
||||
}
|
||||
}
|
||||
if (\PHP_VERSION_ID >= 80000) {
|
||||
require_once __DIR__ . '/Resources/mb_convert_variables.php8';
|
||||
} elseif (!\function_exists('mb_convert_variables')) {
|
||||
function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
|
||||
{
|
||||
return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_ord')) {
|
||||
function mb_ord($string, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_ord($string, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_chr')) {
|
||||
function mb_chr($codepoint, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_chr($codepoint, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_scrub')) {
|
||||
function mb_scrub($string, $encoding = null)
|
||||
{
|
||||
$encoding = null === $encoding ? \mb_internal_encoding() : $encoding;
|
||||
return \mb_convert_encoding($string, $encoding, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_str_split')) {
|
||||
function mb_str_split($string, $length = 1, $encoding = null)
|
||||
{
|
||||
return p\Mbstring::mb_str_split($string, $length, $encoding);
|
||||
}
|
||||
}
|
||||
if (\extension_loaded('mbstring')) {
|
||||
return;
|
||||
}
|
||||
if (!\defined('MB_CASE_UPPER')) {
|
||||
\define('MB_CASE_UPPER', 0);
|
||||
}
|
||||
if (!\defined('MB_CASE_LOWER')) {
|
||||
\define('MB_CASE_LOWER', 1);
|
||||
}
|
||||
if (!\defined('MB_CASE_TITLE')) {
|
||||
\define('MB_CASE_TITLE', 2);
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace VendorDuplicator\Symfony\Polyfill\Php70;
|
||||
|
||||
/**
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
final class Php70
|
||||
{
|
||||
public static function intdiv($dividend, $divisor)
|
||||
{
|
||||
$dividend = self::intArg($dividend, __FUNCTION__, 1);
|
||||
$divisor = self::intArg($divisor, __FUNCTION__, 2);
|
||||
if (0 === $divisor) {
|
||||
throw new \DivisionByZeroError('Division by zero');
|
||||
}
|
||||
if (-1 === $divisor && ~\PHP_INT_MAX === $dividend) {
|
||||
throw new \ArithmeticError('Division of PHP_INT_MIN by -1 is not an integer');
|
||||
}
|
||||
return ($dividend - $dividend % $divisor) / $divisor;
|
||||
}
|
||||
public static function preg_replace_callback_array(array $patterns, $subject, $limit = -1, &$count = 0)
|
||||
{
|
||||
$count = 0;
|
||||
$result = (string) $subject;
|
||||
if (0 === ($limit = self::intArg($limit, __FUNCTION__, 3))) {
|
||||
return $result;
|
||||
}
|
||||
foreach ($patterns as $pattern => $callback) {
|
||||
$result = \preg_replace_callback($pattern, $callback, $result, $limit, $c);
|
||||
$count += $c;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
public static function error_clear_last()
|
||||
{
|
||||
static $handler;
|
||||
if (!$handler) {
|
||||
$handler = function () {
|
||||
return \false;
|
||||
};
|
||||
}
|
||||
\set_error_handler($handler);
|
||||
@\trigger_error('');
|
||||
\restore_error_handler();
|
||||
}
|
||||
private static function intArg($value, $caller, $pos)
|
||||
{
|
||||
if (\is_int($value)) {
|
||||
return $value;
|
||||
}
|
||||
if (!\is_numeric($value) || \PHP_INT_MAX <= ($value += 0) || ~\PHP_INT_MAX >= $value) {
|
||||
throw new \TypeError(\sprintf('%s() expects parameter %d to be integer, %s given', $caller, $pos, \gettype($value)));
|
||||
}
|
||||
return (int) $value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
class ArithmeticError extends \Error
|
||||
{
|
||||
}
|
||||
\class_alias('VendorDuplicator\\ArithmeticError', 'ArithmeticError', \false);
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
class AssertionError extends \Error
|
||||
{
|
||||
}
|
||||
\class_alias('VendorDuplicator\\AssertionError', 'AssertionError', \false);
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
class DivisionByZeroError extends \Error
|
||||
{
|
||||
}
|
||||
\class_alias('VendorDuplicator\\DivisionByZeroError', 'DivisionByZeroError', \false);
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
class Error extends \Exception
|
||||
{
|
||||
}
|
||||
\class_alias('VendorDuplicator\\Error', 'Error', \false);
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
class ParseError extends \Error
|
||||
{
|
||||
}
|
||||
\class_alias('VendorDuplicator\\ParseError', 'ParseError', \false);
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
interface SessionUpdateTimestampHandlerInterface
|
||||
{
|
||||
/**
|
||||
* Checks if a session identifier already exists or not.
|
||||
*
|
||||
* @param string $key
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function validateId($key);
|
||||
/**
|
||||
* Updates the timestamp of a session when its data didn't change.
|
||||
*
|
||||
* @param string $key
|
||||
* @param string $val
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function updateTimestamp($key, $val);
|
||||
}
|
||||
\class_alias('VendorDuplicator\\SessionUpdateTimestampHandlerInterface', 'SessionUpdateTimestampHandlerInterface', \false);
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
class TypeError extends \Error
|
||||
{
|
||||
}
|
||||
\class_alias('VendorDuplicator\\TypeError', 'TypeError', \false);
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
use VendorDuplicator\Symfony\Polyfill\Php70 as p;
|
||||
if (\PHP_VERSION_ID >= 70000) {
|
||||
return;
|
||||
}
|
||||
if (!\defined('PHP_INT_MIN')) {
|
||||
\define('PHP_INT_MIN', ~\PHP_INT_MAX);
|
||||
}
|
||||
if (!\function_exists('intdiv')) {
|
||||
function intdiv($num1, $num2)
|
||||
{
|
||||
return p\Php70::intdiv($num1, $num2);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('preg_replace_callback_array')) {
|
||||
function preg_replace_callback_array(array $pattern, $subject, $limit = -1, &$count = 0, $flags = null)
|
||||
{
|
||||
return p\Php70::preg_replace_callback_array($pattern, $subject, $limit, $count);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('error_clear_last')) {
|
||||
function error_clear_last()
|
||||
{
|
||||
return p\Php70::error_clear_last();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace VendorDuplicator\Symfony\Polyfill\Php72;
|
||||
|
||||
/**
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
* @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
final class Php72
|
||||
{
|
||||
private static $hashMask;
|
||||
public static function utf8_encode($s)
|
||||
{
|
||||
$s .= $s;
|
||||
$len = \strlen($s);
|
||||
for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) {
|
||||
switch (\true) {
|
||||
case $s[$i] < "\x80":
|
||||
$s[$j] = $s[$i];
|
||||
break;
|
||||
case $s[$i] < "\xc0":
|
||||
$s[$j] = "\xc2";
|
||||
$s[++$j] = $s[$i];
|
||||
break;
|
||||
default:
|
||||
$s[$j] = "\xc3";
|
||||
$s[++$j] = \chr(\ord($s[$i]) - 64);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return \substr($s, 0, $j);
|
||||
}
|
||||
public static function utf8_decode($s)
|
||||
{
|
||||
$s = (string) $s;
|
||||
$len = \strlen($s);
|
||||
for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) {
|
||||
switch ($s[$i] & "\xf0") {
|
||||
case "\xc0":
|
||||
case "\xd0":
|
||||
$c = \ord($s[$i] & "\x1f") << 6 | \ord($s[++$i] & "?");
|
||||
$s[$j] = $c < 256 ? \chr($c) : '?';
|
||||
break;
|
||||
case "\xf0":
|
||||
++$i;
|
||||
// no break
|
||||
case "\xe0":
|
||||
$s[$j] = '?';
|
||||
$i += 2;
|
||||
break;
|
||||
default:
|
||||
$s[$j] = $s[$i];
|
||||
}
|
||||
}
|
||||
return \substr($s, 0, $j);
|
||||
}
|
||||
public static function php_os_family()
|
||||
{
|
||||
if ('\\' === \DIRECTORY_SEPARATOR) {
|
||||
return 'Windows';
|
||||
}
|
||||
$map = array('Darwin' => 'Darwin', 'DragonFly' => 'BSD', 'FreeBSD' => 'BSD', 'NetBSD' => 'BSD', 'OpenBSD' => 'BSD', 'Linux' => 'Linux', 'SunOS' => 'Solaris');
|
||||
return isset($map[\PHP_OS]) ? $map[\PHP_OS] : 'Unknown';
|
||||
}
|
||||
public static function spl_object_id($object)
|
||||
{
|
||||
if (null === self::$hashMask) {
|
||||
self::initHashMask();
|
||||
}
|
||||
if (null === ($hash = \spl_object_hash($object))) {
|
||||
return;
|
||||
}
|
||||
// On 32-bit systems, PHP_INT_SIZE is 4,
|
||||
return self::$hashMask ^ \hexdec(\substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1));
|
||||
}
|
||||
public static function sapi_windows_vt100_support($stream, $enable = null)
|
||||
{
|
||||
if (!\is_resource($stream)) {
|
||||
\trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, ' . \gettype($stream) . ' given', \E_USER_WARNING);
|
||||
return \false;
|
||||
}
|
||||
$meta = \stream_get_meta_data($stream);
|
||||
if ('STDIO' !== $meta['stream_type']) {
|
||||
\trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', \E_USER_WARNING);
|
||||
return \false;
|
||||
}
|
||||
// We cannot actually disable vt100 support if it is set
|
||||
if (\false === $enable || !self::stream_isatty($stream)) {
|
||||
return \false;
|
||||
}
|
||||
// The native function does not apply to stdin
|
||||
$meta = \array_map('strtolower', $meta);
|
||||
$stdin = 'php://stdin' === $meta['uri'] || 'php://fd/0' === $meta['uri'];
|
||||
return !$stdin && (\false !== \getenv('ANSICON') || 'ON' === \getenv('ConEmuANSI') || 'xterm' === \getenv('TERM') || 'Hyper' === \getenv('TERM_PROGRAM'));
|
||||
}
|
||||
public static function stream_isatty($stream)
|
||||
{
|
||||
if (!\is_resource($stream)) {
|
||||
\trigger_error('stream_isatty() expects parameter 1 to be resource, ' . \gettype($stream) . ' given', \E_USER_WARNING);
|
||||
return \false;
|
||||
}
|
||||
if ('\\' === \DIRECTORY_SEPARATOR) {
|
||||
$stat = @\fstat($stream);
|
||||
// Check if formatted mode is S_IFCHR
|
||||
return $stat ? 020000 === ($stat['mode'] & 0170000) : \false;
|
||||
}
|
||||
return \function_exists('posix_isatty') && @\posix_isatty($stream);
|
||||
}
|
||||
private static function initHashMask()
|
||||
{
|
||||
$obj = (object) array();
|
||||
self::$hashMask = -1;
|
||||
// check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below
|
||||
$obFuncs = array('ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush');
|
||||
foreach (\debug_backtrace(\PHP_VERSION_ID >= 50400 ? \DEBUG_BACKTRACE_IGNORE_ARGS : \false) as $frame) {
|
||||
if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) {
|
||||
$frame['line'] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!empty($frame['line'])) {
|
||||
\ob_start();
|
||||
\debug_zval_dump($obj);
|
||||
self::$hashMask = (int) \substr(\ob_get_clean(), 17);
|
||||
}
|
||||
self::$hashMask ^= \hexdec(\substr(\spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1));
|
||||
}
|
||||
public static function mb_chr($code, $encoding = null)
|
||||
{
|
||||
if (0x80 > ($code %= 0x200000)) {
|
||||
$s = \chr($code);
|
||||
} elseif (0x800 > $code) {
|
||||
$s = \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f);
|
||||
} elseif (0x10000 > $code) {
|
||||
$s = \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f);
|
||||
} else {
|
||||
$s = \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f);
|
||||
}
|
||||
if ('UTF-8' !== $encoding) {
|
||||
$s = \mb_convert_encoding($s, $encoding, 'UTF-8');
|
||||
}
|
||||
return $s;
|
||||
}
|
||||
public static function mb_ord($s, $encoding = null)
|
||||
{
|
||||
if (null === $encoding) {
|
||||
$s = \mb_convert_encoding($s, 'UTF-8');
|
||||
} elseif ('UTF-8' !== $encoding) {
|
||||
$s = \mb_convert_encoding($s, 'UTF-8', $encoding);
|
||||
}
|
||||
if (1 === \strlen($s)) {
|
||||
return \ord($s);
|
||||
}
|
||||
$code = ($s = \unpack('C*', \substr($s, 0, 4))) ? $s[1] : 0;
|
||||
if (0xf0 <= $code) {
|
||||
return ($code - 0xf0 << 18) + ($s[2] - 0x80 << 12) + ($s[3] - 0x80 << 6) + $s[4] - 0x80;
|
||||
}
|
||||
if (0xe0 <= $code) {
|
||||
return ($code - 0xe0 << 12) + ($s[2] - 0x80 << 6) + $s[3] - 0x80;
|
||||
}
|
||||
if (0xc0 <= $code) {
|
||||
return ($code - 0xc0 << 6) + $s[2] - 0x80;
|
||||
}
|
||||
return $code;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
namespace VendorDuplicator;
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
use VendorDuplicator\Symfony\Polyfill\Php72 as p;
|
||||
if (\PHP_VERSION_ID >= 70200) {
|
||||
return;
|
||||
}
|
||||
if (!\defined('PHP_FLOAT_DIG')) {
|
||||
\define('PHP_FLOAT_DIG', 15);
|
||||
}
|
||||
if (!\defined('PHP_FLOAT_EPSILON')) {
|
||||
\define('PHP_FLOAT_EPSILON', 2.2204460492503E-16);
|
||||
}
|
||||
if (!\defined('PHP_FLOAT_MIN')) {
|
||||
\define('PHP_FLOAT_MIN', 2.2250738585072E-308);
|
||||
}
|
||||
if (!\defined('PHP_FLOAT_MAX')) {
|
||||
\define('PHP_FLOAT_MAX', 1.7976931348623157E+308);
|
||||
}
|
||||
if (!\defined('PHP_OS_FAMILY')) {
|
||||
\define('PHP_OS_FAMILY', p\Php72::php_os_family());
|
||||
}
|
||||
if ('\\' === \DIRECTORY_SEPARATOR && !\function_exists('sapi_windows_vt100_support')) {
|
||||
function sapi_windows_vt100_support($stream, $enable = null)
|
||||
{
|
||||
return p\Php72::sapi_windows_vt100_support($stream, $enable);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('stream_isatty')) {
|
||||
function stream_isatty($stream)
|
||||
{
|
||||
return p\Php72::stream_isatty($stream);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('utf8_encode')) {
|
||||
function utf8_encode($string)
|
||||
{
|
||||
return p\Php72::utf8_encode($string);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('utf8_decode')) {
|
||||
function utf8_decode($string)
|
||||
{
|
||||
return p\Php72::utf8_decode($string);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('spl_object_id')) {
|
||||
function spl_object_id($object)
|
||||
{
|
||||
return p\Php72::spl_object_id($object);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_ord')) {
|
||||
function mb_ord($string, $encoding = null)
|
||||
{
|
||||
return p\Php72::mb_ord($string, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_chr')) {
|
||||
function mb_chr($codepoint, $encoding = null)
|
||||
{
|
||||
return p\Php72::mb_chr($codepoint, $encoding);
|
||||
}
|
||||
}
|
||||
if (!\function_exists('mb_scrub')) {
|
||||
function mb_scrub($string, $encoding = null)
|
||||
{
|
||||
$encoding = null === $encoding ? \mb_internal_encoding() : $encoding;
|
||||
return \mb_convert_encoding($string, $encoding, $encoding);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user