$block) { foreach (['text', 'caption', 'label', 'title', 'hint', 'provider'] as $feld) { $wert = $block['props'][$feld] ?? null; if (!is_string($wert) || '' === $wert) { continue; } $neu = $entschachteln($wert); if ($neu !== $wert) { $liste[$index]['props'][$feld] = $neu; ++$zahl; if (count($beispiele) < 6) { $beispiele[] = mb_substr($wert, 0, 60).' → '.mb_substr($neu, 0, 60); } } } if (isset($block['children']) && is_array($block['children'])) { $liste[$index]['children'] = $bausteine($block['children'], $zahl, $beispiele); } } return $liste; }; $gesamt = 0; $berichte = []; // Die aktiven Fassungen jeder Seite: veröffentlicht und Entwurf. $aktive = []; foreach ($db->fetchAllAssociative('SELECT id, path, published_revision_id, draft_revision_id FROM page') as $seite) { foreach (['published_revision_id' => 'veröffentlicht', 'draft_revision_id' => 'Entwurf'] as $spalte => $was) { if (!empty($seite[$spalte])) { $aktive[(string) $seite[$spalte]] = '/'.$seite['path'].' ('.$was.')'; } } } foreach ($aktive as $revision => $bezeichnung) { $roh = $db->fetchOne('SELECT document FROM revision WHERE id = ?', [$revision]); if (!is_string($roh)) { continue; } $dokument = json_decode($roh, true, 512, JSON_THROW_ON_ERROR); $zahl = 0; $beispiele = []; $dokument['blocks'] = $bausteine($dokument['blocks'] ?? [], $zahl, $beispiele); if (0 === $zahl) { continue; } $gesamt += $zahl; $berichte[] = ['was' => $bezeichnung, 'zahl' => $zahl, 'beispiele' => $beispiele]; if ($schreiben) { // Geprüft wird wie beim Speichern - eine Korrektur darf kein ungültiges Dokument hinterlassen. $validator->validate($dokument, writing: true); $db->executeStatement('UPDATE revision SET document = ? WHERE id = ?', [json_encode($dokument, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), $revision]); } } // Und die Bereiche (Kopf, Fuß, verknüpfte Sektionen). foreach ($db->fetchAllAssociative('SELECT id, kind, name, document FROM partial') as $bereich) { $dokument = json_decode((string) $bereich['document'], true, 512, JSON_THROW_ON_ERROR); $zahl = 0; $beispiele = []; $dokument['blocks'] = $bausteine($dokument['blocks'] ?? [], $zahl, $beispiele); if (0 === $zahl) { continue; } $gesamt += $zahl; $berichte[] = ['was' => 'Bereich '.$bereich['kind'].' „'.$bereich['name'].'“', 'zahl' => $zahl, 'beispiele' => $beispiele]; if ($schreiben) { $validator->validate($dokument, writing: true); $db->executeStatement('UPDATE partial SET document = ? WHERE id = ?', [json_encode($dokument, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), $bereich['id']]); } } foreach ($berichte as $bericht) { echo $bericht['was'], ': ', $bericht['zahl'], ' Stelle(n)', "\n"; foreach ($bericht['beispiele'] as $beispiel) { echo ' ', $beispiel, "\n"; } } if (0 === $gesamt) { echo "Nichts zu reparieren.\n"; exit(0); } echo $schreiben ? "$gesamt Stelle(n) repariert.\n" : "$gesamt Stelle(n) gefunden. Mit --schreiben anwenden.\n";