| 
<?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);
 
 |