- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/classes/general/punycode.php
- Класс: CBXPunycode
- Вызов: CBXPunycode::NamePrepUcs4
private function NamePrepUcs4($input)
{
$output = [];
foreach ($input as $v)
{
if (in_array($v, self::$rfc3454Table['Skip']))
continue;
if (in_array($v, self::$rfc3454Table['Reject'])
|| in_array($v, self::$rfc3454Table['RejectGeneral']))
{
$this->AddError('Rejected code U+'.sprintf('%08X', $v));
return false;
}
foreach (self::$rfc3454Table['RejectRanges'] as $range)
{
if ($range[0] <= $v && $v <= $range[1])
{
$this->AddError('Rejected code U+'.sprintf('%08X', $v));
return false;
}
}
if ($v >= 0xAC00 && $v <= 0xD7AF)
{
foreach ($this->DecomposeKorean($v) as $out)
$output[] = (int) $out;
}
else
{
$output[] = (int) $v;
}
}
$output = $this->ComposeKorean($output);
$lastClass = 0;
$lastStarter = 0;
$outputLength = count($output);
for ($i = 0; $i < $outputLength; $i++)
{
$class = self::$rfc3454Table['CombiningClass'][$output[$i]] ?? 0;
if ((!$lastClass || $lastClass > $class) && $class)
{
$sequenceLength = $i - $lastStarter;
$out = $this->Combine(array_slice($output, $lastStarter, $sequenceLength));
if ($out)
{
$output[$lastStarter] = $out;
if (count($output) != $sequenceLength)
{
for ($j = $i + 1; $j < $outputLength; $j++)
$output[$j - 1] = $output[$j];
unset($output[$outputLength]);
}
$i--;
$outputLength--;
if ($i == $lastStarter)
{
$lastClass = 0;
}
else
{
$lastClass = self::$rfc3454Table['CombiningClass'][$output[$i - 1]] ?? 0;
}
continue;
}
}
if (!$class)
$lastStarter = $i;
$lastClass = $class;
}
return $output;
}