blocks and tags outside a small allow list go. */ public function html(string $value): string { if ($this->unfiltered) { return $value; } $value = (string) preg_replace('#]*>.*?#is', '', str_replace(chr(0), '', $value)); return (string) preg_replace( '#]*>#i', '', $value ); } public function code(string $value): string { return $value; } public function url(string $value): string { return str_starts_with(strtolower(trim($value)), 'javascript:') ? '' : trim($value); } public function allowsUnfilteredHtml(): bool { return $this->unfiltered; } }; } public static function media(): MediaResolver { return new class implements MediaResolver { public function image(int $id): ?array { return match ($id) { 33 => ['url' => 'https://kunde.test/wp-content/uploads/team.jpg', 'alt' => 'Unser Team'], 12 => ['url' => 'https://kunde.test/wp-content/uploads/halle.jpg', 'alt' => ''], default => null, }; } }; } public static function placeholders(): Placeholders { return new Placeholders(DesignSystemTest::sample()); } public static function attrWriter(bool $unfiltered = false): AttrWriter { return new AttrWriter(ModuleCatalogTest::sampleCatalog(), self::placeholders(), self::sanitizer($unfiltered)); } }