diff --git a/src/components/sections/OpenSpacesCalendar.astro b/src/components/sections/OpenSpacesCalendar.astro index 5fd87b583..8e702d2af 100644 --- a/src/components/sections/OpenSpacesCalendar.astro +++ b/src/components/sections/OpenSpacesCalendar.astro @@ -15,9 +15,6 @@ export interface Props { } const { - calendarId = "c_b87075b29cf4a9dd4da3fe724fcba92a4b406aa3f91cb7e7ce50fede43215b17@group.calendar.google.com", - timeMin = "20260713", - timeMax = "20260719", rooms = ["S4(1,2,3)", "S4(4)", "S4(5)"], } = Astro.props; @@ -35,6 +32,7 @@ function fmtDateLabel(isoDate: string): string { } catch { return isoDate; } } + // ── Main data fetch ── const allEvents = await fetchOpenSpacesEvents(); @@ -57,7 +55,7 @@ const displayRooms = rooms; function buildTimeSlots(dayEvents: OpenSpaceEvent[]) { const timeMap = new Map>(); for (const ev of dayEvents) { - const label = ev.startTime; + const label = fmtTime(ev.startISO); if (!timeMap.has(label)) timeMap.set(label, {}); const slot = timeMap.get(label); if (slot) slot[ev.room] = ev; @@ -87,7 +85,7 @@ const hasEvents = sortedDates.length > 0; {timeSlots.length > 0 ? (
-
Time
+
Time (CEST)
{displayRooms.map((room) => (
{room}
))} diff --git a/src/pages/session/open-space/[slug].astro b/src/pages/session/open-space/[slug].astro index 52964d602..73f07c61f 100644 --- a/src/pages/session/open-space/[slug].astro +++ b/src/pages/session/open-space/[slug].astro @@ -16,11 +16,19 @@ export async function getStaticPaths() { const { event } = Astro.props as { event: OpenSpaceEvent }; +const tz = "Europe/Warsaw"; + const dateLabel = new Date(event.date + "T12:00:00Z").toLocaleDateString( "en-GB", - { timeZone: "Europe/Warsaw", weekday: "long", day: "numeric", month: "long", year: "numeric" } + { timeZone: tz, weekday: "long", day: "numeric", month: "long", year: "numeric" } ); +const timeLabel = (() => { + const start = new Date(event.startISO).toLocaleTimeString("en-GB", { timeZone: tz, hour: "2-digit", minute: "2-digit" }); + const end = new Date(event.endISO).toLocaleTimeString("en-GB", { timeZone: tz, hour: "2-digit", minute: "2-digit" }); + return `${start} \u2013 ${end} CEST`; +})(); + const backUrl = event.date ? `/open-spaces#osp-day-${event.date}` : "/open-spaces"; @@ -47,9 +55,7 @@ const backUrl = event.date
Date:
{dateLabel}
Time:
-
- {event.startTime} – {event.endTime} -
+
{timeLabel}
diff --git a/src/utils/openSpaces.ts b/src/utils/openSpaces.ts index c48c13a35..4f6d6971f 100644 --- a/src/utils/openSpaces.ts +++ b/src/utils/openSpaces.ts @@ -27,7 +27,7 @@ export interface OpenSpaceEvent { function stripHtml(s: string): string { return s - .replace(/[<>]/g, "") + .replace(/<[^>]*(?:>|$)/g, "") .replace(/https?:\/\/ep[^.]*\.europython\.eu(\/[^\s]/g, "") + .replace(/<[^>]*(?:>|$)/g, "") .replace(/https?:\/\/ep[^.]*\.europython\.eu(\/[^\s]/g, "") + .replace(/<[^>]*(?:>|$)/g, "") .replace(/'/g, "'") .replace(/&/g, "&") .replace(/\\n/g, "\n"); @@ -150,8 +150,8 @@ function parseICal(ics: string): OpenSpaceEvent[] { const summary = getVal("SUMMARY"); const rawDescription = getVal("DESCRIPTION"); const organizer = getVal("ORGANIZER"); - let dtStartRaw = getVal("DTSTART"); - let dtEndRaw = getVal("DTEND"); + const dtStartRaw = getVal("DTSTART"); + const dtEndRaw = getVal("DTEND"); if (!dtStartRaw) continue; const startDt = parseDt(dtStartRaw); @@ -175,7 +175,7 @@ function parseICal(ics: string): OpenSpaceEvent[] { ); if (descMatch) { fullDescription = descMatch[1] - .replace(/[<>]/g, "") + .replace(/<[^>]*(?:>|$)/g, "") .replace(/'/g, "'") .replace(/&/g, "&") .replace(/\\n/g, "\n")