Ein DGS-Video liess sich bisher gar nicht einbinden: Der Markdown- Prozessor laeuft mit Sanitizing, und remark reicht rohes HTML dann von vornherein nicht durch - <video> kam als leeres <p> heraus. Eine erweiterte Freigabeliste allein half deshalb nicht. Statt rohes HTML fuer alle Textfelder zu oeffnen - auch fuer die 121 Erklaerungen - bekommt die Gebaerdensprach-Seite zwei eigene Felder fuer Video- und Untertiteladresse. Ausgegeben wird ein natives <video controls> mit <track kind="captions"> und Bildunterschrift. Adressen werden zweimal geprueft, beim Speichern und vor der Ausgabe: zugelassen sind nur der eigene Server und https. javascript:, data:, protokollrelative und einfache http-Adressen werden abgewiesen. iframe bleibt bewusst gesperrt - eine YouTube-Einbindung wuerde Besucherdaten an Dritte uebertragen. Erklaerung zur Barrierefreiheit entsprechend gekuerzt: Die beiden Luecken nach § 4 BITV 2.0 entfallen, es bleibt die ungepruefte Druckansicht. Geprueft: Video wird mit Untertitelspur ausgeliefert und ist per Tastatur erreichbar, axe-core meldet auf beiden neuen Seiten in hell und dunkel keine Verstoesse, Adresspruefung weist alle acht Testfaelle korrekt zu. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
26 lines
666 B
TypeScript
26 lines
666 B
TypeScript
import { PrismaClient } from '@prisma/client'
|
||
|
||
import {
|
||
EMPTY_SITE_PAGES,
|
||
SITE_MEDIA,
|
||
SITE_PAGES,
|
||
SitePagesContent,
|
||
} from '@/lib/site-pages'
|
||
|
||
// Prisma client instance
|
||
const prisma = new PrismaClient()
|
||
|
||
/**
|
||
* Liest die Inhalte der rechtlichen Seiten (id = 1). Fehlt der Datensatz,
|
||
* kommen leere Texte zurück – die Seiten liefern dann 404.
|
||
*/
|
||
export async function readSitePages(): Promise<SitePagesContent> {
|
||
const row = await prisma.sitePages.findUnique({ where: { id: 1 } })
|
||
|
||
if (!row) return { ...EMPTY_SITE_PAGES }
|
||
|
||
return Object.fromEntries(
|
||
[...SITE_PAGES, ...SITE_MEDIA].map((key) => [key, row[key] ?? ''])
|
||
) as SitePagesContent
|
||
}
|