function normalizeBaseUrl(value) { const raw = String(value || '').trim() if (!raw) return '' return raw.replace(/\/+$/, '') } function escapeXml(value) { return String(value) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, ''') } function toAbsoluteUrl(baseUrl, path) { const normalizedPath = path.startsWith('/') ? path : `/${path}` return `${baseUrl}${normalizedPath}` } export default defineEventHandler((event) => { const runtimeConfig = useRuntimeConfig(event) const requestUrl = getRequestURL(event) const baseUrl = normalizeBaseUrl(runtimeConfig.public?.baseUrl) || `${requestUrl.protocol}//${requestUrl.host}` const today = new Date().toISOString().slice(0, 10) const routes = [ '/', '/kontakt', '/termine', '/mitgliedschaft', '/spielplan', '/mannschaften', '/mannschaften/spielplaene', '/mannschaften/herren', '/mannschaften/damen', '/mannschaften/jugend', '/training', '/training/trainer', '/training/anfaenger', '/vereinsmeisterschaften', '/spielsysteme', '/links', '/vorstand', '/impressum', '/datenschutz', '/tt-regeln', '/ueber-uns', '/geschichte', '/satzung', '/galerie', '/verein/ueber-uns', '/verein/geschichte', '/verein/satzung', '/verein/tt-regeln', '/verein/galerie', '/newsletter/subscribe', '/newsletter/unsubscribe' ] const uniqueRoutes = [...new Set(routes)] const entries = uniqueRoutes.map((route) => { const loc = escapeXml(toAbsoluteUrl(baseUrl, route)) const priority = route === '/' ? '1.0' : '0.7' return [ ' ', ` ${loc}`, ` ${today}`, ' weekly', ` ${priority}`, ' ' ].join('\n') }) const xml = [ '', '', entries.join('\n'), '', '' ].join('\n') setHeader(event, 'Content-Type', 'application/xml; charset=utf-8') return xml })