1
0
Fork 0
mirror of https://github.com/netz39/www.netz39.de.git synced 2025-08-11 06:20:47 +02:00

Merge pull request from netz39/150-todo-dauertermine-als-banner

feat(events): banners for rrule event and tags for ics

See discussion for details.
This commit is contained in:
Stefan Haun 2025-05-06 15:31:52 +02:00 committed by GitHub
commit 93d158b6ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 115 additions and 52 deletions

View file

@ -45,12 +45,13 @@ Unsere Webseite setzt aus folgenden Gründen auf Jekyll, einen statischen Websit
layout: event
title: "Titel des Events"
author: MaxMustermann # optional, soll angegeben werden, wenn du der Ansprechpartner des Events bist
tags: 'example,halloWelt' # every tag will result in a seperate ics feed
event:
start: 2023-10-20 19:00:00 # Datum, an dem das Event stattfindet. Die Zeit ist optional
end: 2023-10-20 21:00:00 # optional, Zeitpunkt, an dem das Event endet
organizer: "Netz39 Team <kontakt@netz39.de>" # optional, Kontaktdaten im ical Event
location: "Netz39 e.V." # optional, Ort des Events
rrule: "FREQ=MONTHLY;INTERVAL=1;BYDAY=1FR,1TH" # follows https://icalendar.org/iCalendar-RFC-5545/3-3-10-recurrence-rule.html
rrule: "FREQ=MONTHLY;INTERVAL=1;BYDAY=1FR,1TH;DTSTART=20231020T190000" # follows https://icalendar.org/iCalendar-RFC-5545/3-3-10-recurrence-rule.html the given order is relevant!
---
```
- Unterhalb des Front Matters die Beschreibung des Events in Markdown aufschreiben

View file

@ -12,26 +12,9 @@ module Jekyll
default_organizer = "Netz39 Team <kontakt@netz39.de>"
default_location = "Netz39 e.V., Leibnizstraße 32, 39104 Magdeburg"
default_duration = Rational(4, 24)
cal = Icalendar::Calendar.new
# Define Europe/Berlin timezone with standard rules (incl. DST)
cal.timezone do |t|
t.tzid = "Europe/Berlin"
# Daylight Saving Time (DST) adjustments (if applicable)
t.daylight do |d|
d.tzoffsetfrom = "-0100"
d.tzoffsetto = "-0200"
d.dtstart = "19700329T020000"
d.tzname = "CEST"
end
# Standard Time definition
t.standard do |s|
s.tzoffsetfrom = "-0200"
s.tzoffsetto = "-0100"
s.dtstart = "19701025T030000"
s.tzname = "CET"
end
end
cals = Hash.new()
calAllEvents = Icalendar::Calendar.new
cals[:events] = calAllEvents
events.each do |event|
title = event.data['title']
@ -40,6 +23,7 @@ module Jekyll
organizer = event.data.dig('event', 'organizer') || default_organizer
location = event.data.dig('event', 'location') || default_location
rrule = event.data.dig('event', 'rrule')
tags = event.data['tags']
# Skip events older than 365 days
next if start_date.to_date < (Date.today - 365)
@ -71,11 +55,45 @@ module Jekyll
ical_event.description = description
ical_event.organizer = organizer
ical_event.location = location
cal.add_event(ical_event)
end
site.pages << IcalPage.new(site, site.source, 'feed/eo-events', "events.ics", cal)
puts "Generated events.ics page from #{events.length} events"
cals[:events].add_event(ical_event)
if tags
tags.join('').split(/,/).each do |tag|
if cals.key?(tag)
cals[tag].add_event(ical_event)
else
newCal = Icalendar::Calendar.new
newCal.add_event(ical_event)
cals[tag] = newCal
end
end
end
end
cals.each_key { |tag|
cal = cals[tag]
# Define Europe/Berlin timezone with standard rules (incl. DST)
cal.timezone do |t|
t.tzid = "Europe/Berlin"
# Daylight Saving Time (DST) adjustments (if applicable)
t.daylight do |d|
d.tzoffsetfrom = "-0100"
d.tzoffsetto = "-0200"
d.dtstart = "19700329T020000"
d.tzname = "CEST"
end
# Standard Time definition
t.standard do |s|
s.tzoffsetfrom = "-0200"
s.tzoffsetto = "-0100"
s.dtstart = "19701025T030000"
s.tzname = "CET"
end
end
site.pages << IcalPage.new(site, site.source, 'feed/eo-events/', "#{tag}.ics", cal)
puts "Generated #{tag}.ics page from #{events.length} events"
}
end
end

View file

@ -37,41 +37,85 @@ position: 1
calendar.render();
});
const icalFeedUrls = {};
</script>
</head>
<body>
<div id='calendar' style="width:95%; margin: auto;"></div>
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center; border: 1px">
<div style="display: flex; align-items: center; margin-top: 50px">
<p>iCal-Feed:
<code id="icalFeedUrl" style="box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1); font-family: monospace;"></code>
</p>
<a id="copyButton" class="button" style="margin-left: 10px; margin-top: 0px">
<i class="fas fa-copy" title="In Zwischenablage kopieren"></i>
</a>
</div>
<div class="posts">
{% for event in site.events %}
{% if event.event.rrule %}
<div class="post-teaser">
{% if event.image %}
<div class="post-img">
<a aria-label="{{ event.title }}" href="{{ event.url | relative_url }}">
<img alt="{{ event.title }}" src="{{ event.image | relative_url }}">
</a>
</div>
{% endif %}
<span>
<header>
<h1>
<a aria-label="{{ event.title }}" class="post-link" href="{{ event.url | relative_url }}">
{{ event.title }}
</a>
</h1>
{% include blog/post_info.liquid author=event.author date=event.event.start rrule=event.event.rrule %}
</header>
{% if site.excerpt or site.theme_settings.excerpt %}
<div class="excerpt">
{% if site.excerpt == "truncate" %}
{{ event.content | strip_html | truncate: '250' | escape }}
{% else %}
{{ event.excerpt | strip_html | escape }}
{% endif %}
</div>
{% endif %}
</span>
</div>
{% endif %}
{% endfor %}
</div>
<div id='calendar' style="width:95%; margin: auto; margin-top: 50px;"></div>
<div style="display: flex; align-items: center; margin-top: 50px; width: 100%; padding: 15px;">
<h3 style="margin: auto; margin-right: 0px">ICal Feeds</h3>
<div style="display: flex; flex-direction: column; margin: auto; margin-left: 15px">
{% for feed in site.pages %}
{% assign name = feed.name | downcase %}
{% if name contains 'ics' %}
<div style="display: flex; align-items: center; width: 100%;">
<p style="margin-bottom: 0px; margin-right: 10px;">{{ feed.name | replace: '.ics', '' }}</p>
<code id="{{feed.name}}-url" style="box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1); font-family: monospace;"></code>
<a id="{{feed.name}}-cpbtn" style="margin-left: 10px; margin-top: 0px; margin-bottom: 0px;">
<i class="fas fa-copy" title="In Zwischenablage kopieren"></i>
</a>
</div>
{% endif %}
{% endfor %}
</div>
</div>
<script>
const ICAL_FEED_URL = "{{site.url}}/feed/eo-events/events.ics";
{% for feed in site.pages %}
{% assign name = feed.name | downcase %}
{% if name contains 'ics' %}
<script>
icalFeedUrls["{{feed.name}}"] = { url: "{{site.url}}/feed/eo-events/{{feed.name}}", btn: document.getElementById("{{feed.name}}-cpbtn")};
// set text in HTML element "icalFeedUrl" to the URL
document.getElementById("icalFeedUrl").textContent = ICAL_FEED_URL;
// set text in HTML element "{{feed.name}}-url" to the URL
document.getElementById("{{feed.name}}-url").textContent = icalFeedUrls["{{feed.name}}"].url;
const copyButton = document.getElementById('copyButton');
const urlToCopy = ICAL_FEED_URL;
copyButton.addEventListener('click', () => {
const tempInput = document.createElement('input');
tempInput.value = urlToCopy;
document.body.appendChild(tempInput);
tempInput.select();
document.execCommand('copy');
document.body.removeChild(tempInput);
alert('URL wurde in die Zwischenablage kopiert!');
});
</script>
icalFeedUrls["{{feed.name}}"].btn.addEventListener('click', () => {
const tempInput = document.createElement('input');
tempInput.value = icalFeedUrls["{{feed.name}}"].url;
document.body.appendChild(tempInput);
tempInput.select();
document.execCommand('copy');
document.body.removeChild(tempInput);
alert('URL wurde in die Zwischenablage kopiert!');
});
</script>
{% endif %}
{% endfor %}
</body>
</html>