feat(wiki): Enrich wiki with DACH court decisions and 18 new articles

- Update all 10 existing articles with real source URLs (EuGH, BAG, DSK, BfDI)
- Add 18 new articles covering:
  - EuGH C-184/20 (wide interpretation Art. 9)
  - EuGH C-667/21 (cumulative legal basis)
  - EuGH C-34/21 (§26 BDSG unconstitutional)
  - EuGH C-634/21 (SCHUFA scoring)
  - EuGH C-582/14 (IP addresses as personal data)
  - Biometric data, indirect Art. 9 data in daily practice
  - Retention periods overview
  - Video surveillance and GPS tracking at workplace
  - Communication data (email/chat, Fernmeldegeheimnis)
  - Financial data, PCI DSS, SEPA
  - Minors (Art. 8 DSGVO)
  - Austria DSG specifics, Switzerland revDSG
  - AI training data and GDPR/AI Act
  - "Forced" special categories
- Add 3 new categories (EuGH-Leiturteile, Aufbewahrungsfristen, DACH-Besonderheiten)
- Add code block rendering to markdown renderer
- Add Clock, Globe, Gavel icons to icon map
- Total: 11 categories, 28 articles, all with verified source URLs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-09 20:43:23 +01:00
parent 61064fdcba
commit 1c59996f32
2 changed files with 1019 additions and 2 deletions

View File

@@ -4,7 +4,7 @@ import { useState, useEffect, useCallback, useMemo } from 'react'
import {
Search, BookOpen, AlertTriangle, Shield, Scale, Handshake,
Briefcase, MessageCircle, Building2, Database, ChevronRight,
ArrowLeft, ExternalLink, Tag,
ArrowLeft, ExternalLink, Tag, Clock, Globe, Gavel,
} from 'lucide-react'
import type { WikiCategory, WikiArticle, WikiSearchResult } from '@/lib/sdk/types'
@@ -19,6 +19,12 @@ function renderMarkdown(md: string): string {
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
// Code blocks (``` ... ```)
html = html.replace(
/^```[\w]*\n([\s\S]*?)^```$/gm,
(_match, code: string) => `<pre class="bg-gray-50 border rounded p-3 my-3 text-xs font-mono overflow-x-auto whitespace-pre">${code.trimEnd()}</pre>`
)
// Tables (must be before other block elements)
html = html.replace(
/^(\|.+\|)\n(\|[\s:|-]+\|)\n((?:\|.+\|\n?)*)/gm,
@@ -44,7 +50,7 @@ function renderMarkdown(md: string): string {
html = html.replace(/((?:<li[^>]*>.*<\/li>\n?)+)/g, '<ul class="my-2 space-y-1">$1</ul>')
// Paragraphs (lines that aren't already HTML)
html = html.replace(/^(?!<[hultd]|$)(.+)$/gm, '<p class="text-sm text-gray-700 my-2">$1</p>')
html = html.replace(/^(?!<[hultdp]|$)(.+)$/gm, '<p class="text-sm text-gray-700 my-2">$1</p>')
return html
}
@@ -62,6 +68,9 @@ const ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {
Briefcase,
MessageCircle,
Building2,
Clock,
Globe,
Gavel,
}
function CategoryIcon({ icon, className }: { icon: string; className?: string }) {

File diff suppressed because it is too large Load Diff