%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/bookmarks/vendor/rowbot/idna/bin/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/bookmarks/vendor/rowbot/idna/bin/Builder.php |
<?php
declare(strict_types=1);
namespace Rowbot\Idna\Bin;
use Rowbot\Idna\Idna;
use RuntimeException;
use function array_map;
use function explode;
use function fclose;
use function fopen;
use function intval;
use function sprintf;
use function usort;
abstract class Builder
{
protected const BASE_URL = 'https://www.unicode.org/Public';
/**
* @return resource
*/
protected static function getIdnaDataResource(string $file)
{
$file = sprintf('%s/idna/%s/%s', self::BASE_URL, Idna::UNICODE_VERSION, $file);
$handle = fopen($file, 'r');
if ($handle === false) {
throw new RuntimeException('Failed to open ' . $file);
}
return $handle;
}
/**
* @return resource
*/
protected static function getUnicodeDataResource(string $file)
{
$file = sprintf('%s/%s/ucd/%s', self::BASE_URL, Idna::UNICODE_VERSION, $file);
$handle = fopen($file, 'r');
if ($handle === false) {
throw new RuntimeException('Failed to open ' . $file);
}
return $handle;
}
/**
* @return list<int>
*/
protected static function parseCodePoints(string $codePoints): array
{
$range = explode('..', $codePoints);
$start = intval($range[0], 16);
$end = isset($range[1]) ? intval($range[1], 16) : $start;
return [$start, $end];
}
/**
* @return array<int, array<int, array<int, int>|string>>
*/
protected static function parseProperties(string $file): array
{
$handle = self::getUnicodeDataResource($file);
$retVal = [];
while (($line = fgets($handle)) !== false) {
if ($line === "\n" || $line[0] === '#') {
continue;
}
[$data] = explode('#', $line);
$data = array_map('trim', explode(';', $data));
$data[0] = self::parseCodePoints($data[0]);
$retVal[] = $data;
}
fclose($handle);
usort($retVal, static function (array $a, array $b): int {
return $a[0][0] <=> $b[0][0];
});
return $retVal;
}
}