• Модуль: 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;
}