<?php $inputFile = __DIR__ . '/CaseFolding.txt'; $outputFile = __DIR__ . '/../src/NamePrep/CaseFoldingData.php'; $map = []; // Datei zeilenweise lesen foreach (file($inputFile) as $line) { // Kommentare und leere Zeilen überspringen if (empty($line) || $line[0] === '#') { continue; } [$code, $status, $mapping] = array_map('trim', explode(';', $line)); // ignore mapping irrelevant for IDNA2008 if (!in_array($status, ['C', 'F'], true)) { continue; } // For IDNA2008, ß must not be case-folded to "ss" if (strtoupper($code) === '00DF') { continue; } $from = hexdec($code); $to = array_map('hexdec', explode(' ', $mapping)); $map[$from] = $to; } $output = '<?php declare(strict_types=1); namespace Algo26\IdnaConvert\NamePrep; /** * @codeCoverageIgnore character maps */ class CaseFoldingData implements CaseFoldingDataInterface { public array $foldingMap = [ '; foreach ($map as $from => $to) { $fromHex = sprintf('0x%X', $from); $toHex = array_map(fn($v) => sprintf('0x%X', $v), $to); $output .= ' ' . $fromHex . ' => [' . join(', ', $toHex) .'],' . PHP_EOL; } $output .= ' ]; } '; file_put_contents($outputFile, $output); |