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