Skip to content

Commit fdf07f2

Browse files
committed
Add iCal
Signed-off-by: Kowalski Dragon (kowalski7cc) <kowalski7cc@users.noreply.github.com>
1 parent 15fd28d commit fdf07f2

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

content/schedule.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,16 @@ Per proporre un talk o un laboratorio, visita la nostra Call for Papers (CFP) su
5959
<div class="room">Sala: ${roomName}</div>
6060
<div class="persons">Relatori: ${persons}</div>
6161
<a class="link" href="${url}" target="_blank">Dettagli</a>
62+
<a class="ical-link" href="#" onclick="downloadICS(event, {
63+
title: \`${title.replace(/`/g, "\\`")}\`,
64+
date: \`${date}\`,
65+
start: \`${start}\`,
66+
duration: \`${duration}\`,
67+
room: \`${roomName.replace(/`/g, "\\`")}\`,
68+
persons: \`${persons.replace(/`/g, "\\`")}\`,
69+
url: \`${url}\`,
70+
description: \`${abstract.replace(/`/g, "\\`")}\`
71+
})">Scarica iCal</a>
6272
</div>
6373
`;
6474
if (track === 'Talk') tracks['Talk'].push(eventHtml);
@@ -76,6 +86,41 @@ Per proporre un talk o un laboratorio, visita la nostra Call for Papers (CFP) su
7686
.catch(() => {
7787
document.getElementById('schedule').innerHTML = '<p>Impossibile caricare il programma.</p>';
7888
});
89+
90+
function downloadICS(e, data) {
91+
e.preventDefault();
92+
// Calcola orario di fine
93+
function addDuration(start, duration) {
94+
const [h, m] = duration.split(':').map(Number);
95+
const date = new Date(`${data.date}T${data.start}`);
96+
date.setHours(date.getHours() + h);
97+
date.setMinutes(date.getMinutes() + m);
98+
return date.toISOString().replace(/[-:]/g, '').slice(0,15) + 'Z';
99+
}
100+
const dtStart = `${data.date.replace(/-/g, '')}T${data.start.replace(/:/g, '')}00Z`;
101+
const dtEnd = addDuration(data.start, data.duration);
102+
const icsContent = [
103+
'BEGIN:VCALENDAR',
104+
'VERSION:2.0',
105+
'PRODID:-//endsummercamp//ESC21//IT',
106+
'BEGIN:VEVENT',
107+
`SUMMARY:${data.title}`,
108+
`DESCRIPTION:${data.description}\\nRelatori: ${data.persons}\\nDettagli: ${data.url}`,
109+
`LOCATION:${data.room}`,
110+
`DTSTART:${dtStart}`,
111+
`DTEND:${dtEnd}`,
112+
`URL:${data.url}`,
113+
'END:VEVENT',
114+
'END:VCALENDAR'
115+
].join('\r\n');
116+
const blob = new Blob([icsContent], { type: 'text/calendar' });
117+
const link = document.createElement('a');
118+
link.href = URL.createObjectURL(blob);
119+
link.download = `${data.title.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.ics`;
120+
document.body.appendChild(link);
121+
link.click();
122+
document.body.removeChild(link);
123+
}
79124
</script>
80125
<noscript>
81126
<p>Per visualizzare il programma, abilita JavaScript nel tuo browser o vai <a href="https://pretalx.endsummer.camp/2K25/schedule/nojs">sul calendario di Pretalx</a>.</p>

0 commit comments

Comments
 (0)