resolveSlug($slug); $page = LegalPage::query() ->where('slug', $resolvedSlug) ->where('is_published', true) ->orderByDesc('version') ->first(); if (! $page) { abort(404); } $locale = app()->getLocale(); $title = $page->title[$locale] ?? $page->title[$page->locale_fallback] ?? $page->title['de'] ?? $page->title['en'] ?? Str::title($resolvedSlug); $bodyMarkdown = $page->body_markdown[$locale] ?? $page->body_markdown[$page->locale_fallback] ?? reset($page->body_markdown) ?? ''; $effectiveFrom = optional($page->effective_from); return Inertia::render('legal/Show', [ 'seoTitle' => $title . ' - ' . config('app.name', 'Fotospiel'), 'title' => $title, 'content' => $this->convertMarkdownToHtml($bodyMarkdown), 'effectiveFrom' => $effectiveFrom ? $effectiveFrom->toDateString() : null, 'effectiveFromLabel' => $effectiveFrom ? __('legal.effective_from', ['date' => $effectiveFrom->translatedFormat('d. F Y')]) : null, 'versionLabel' => __('legal.version', ['version' => $page->version]), 'slug' => $resolvedSlug, ]); } private function resolveSlug(?string $slug): string { $slug = strtolower($slug ?? ''); $aliases = [ 'imprint' => 'impressum', 'privacy' => 'datenschutz', 'terms' => 'agb', ]; return $aliases[$slug] ?? $slug ?: 'impressum'; } private function convertMarkdownToHtml(string $markdown): string { $environment = new Environment([ 'html_input' => 'strip', 'allow_unsafe_links' => false, ]); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addExtension(new TableExtension()); $environment->addExtension(new AutolinkExtension()); $environment->addExtension(new StrikethroughExtension()); $environment->addExtension(new TaskListExtension()); $converter = new MarkdownConverter($environment); return trim((string) $converter->convert($markdown)); } }