diff --git a/_data/event-links.yml b/_data/event-links.yml index 51b6db68e..63cf4f226 100644 --- a/_data/event-links.yml +++ b/_data/event-links.yml @@ -1,8 +1,8 @@ # used for event layout -- key: ICS +- key: calendar-path icon: calendar-plus text: events.links.add-calendar - url: /events.ics + url: https://calendar.antennapod.org/ - key: more-information icon: external-link-square-alt text: events.links.more-information @@ -10,7 +10,7 @@ - key: meeting-room icon: headset text: events.links.open-meeting - url: + url: https://meet.antennapod.org/ - key: blog-post icon: newspaper text: events.links.open-blog @@ -22,4 +22,4 @@ - key: location icon: map text: events.links.open-map - url: https://www.openstreetmap.org/relation/ + url: https://www.openstreetmap.org/ diff --git a/_data/ics-timezones.yml b/_data/ics-timezones.yml deleted file mode 100644 index fcc60916c..000000000 --- a/_data/ics-timezones.yml +++ /dev/null @@ -1,16 +0,0 @@ -# used for ics file -Europe/Brussels: |- - BEGIN:DAYLIGHT - TZOFFSETFROM:+0100 - TZOFFSETTO:+0200 - TZNAME:CEST - DTSTART:19700329T020000 - RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU - END:DAYLIGHT - BEGIN:STANDARD - TZOFFSETFROM:+0200 - TZOFFSETTO:+0100 - TZNAME:CET - DTSTART:19701025T030000 - RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU - END:STANDARD diff --git a/_events/0_A meeting template.md b/_events/0_A meeting template.md index 7b5ce81a4..528808343 100644 --- a/_events/0_A meeting template.md +++ b/_events/0_A meeting template.md @@ -1,49 +1,37 @@ --- title: Awesome get-together on topic X 😎 -# Required. Displayed both on the event detail page and in the ICS calendar event. -summary: -# Required. Displayed on the Events overview page. -image: -# Optional. Displayed on Events overview page and the event detail page. -permalink: -# Optional. "/events/:slug" recommended for recurring events, to avoid that the event gets a date-based URL. -uid: -# Required. Don't edit after publishing. Get one here: https://www.random.org/strings/?num=1&len=20&digits=on&upperalpha=on&unique=on&format=html&rnd=new -sequence: -# Optional. Defaults to 0 if left empty. Should be increased with 1 on every big event edit. -timezone: -# Optional. Timezone used for the event. If not specified, UTC will be used. View & add timezones in _data/ics-timezones.yml -datetime-start: -# Required. Format: yyyy-mm-dd hh:mm. To find the meeting time in UTC, use https://www.timeanddate.com/worldclock/converter.html?p1=1440 -datetime-end: -# Required. Format: yyyy-mm-dd hh:mm. If recurring, this end time is applied also to all occurrences of the generated recurrence set +# Required. Displayed on the event detail page. recurring: # Optional. Can be "yes" recurrence-text: # Required if "recurring: yes". Displayed on Events overview page and the event detail page. View & add strings in _i18n/en.yml -recurrence-rule: -# Required if "recurring: yes". iCAL recurrence rule. Create recurrence rule here: https://icalendar.org/rrule-tool.html -# If used, the UNTIL rule part MUST be specified as a date with UTC time. -recurrence-exceptions: -# Optional. List of dates on which the event is not taking place. Put starting dates that match the recurrence pattern. Time of original meeting will be used & cancelled. Format: -# - yyyy-mm-dd -# - yyyy-mm-dd -recurrence-additions: -# List of date-times on which the event is additionally taking place. Format: -# - start: yyyy-mm-dd hh:mm -# end: yyyy-mm-dd hh:mm -# - start: yyyy-mm-dd hh:mm -# end: yyyy-mm-dd hh:mm +datetime-start: +# Required. Format: yyyy-mm-dd hh:mm. To find the meeting time in UTC, use https://www.timeanddate.com/worldclock/converter.html?p1=1440 +timezone: +# Optional. Timezone used for the event (e.g. Europe/Brussels). If not specified, UTC will be used. Used to complement the time HTML tag on the event page. +summary: +# Required. Displayed on the Events overview page. +image: +# Optional. Displayed on Events overview page and the event detail page. location: -# Required. Must be an osm.org relation ID or the text 'online'. -location-label: -# Recommended. Human-readable description of the location (e.g. address) for ICS. If not provided, link to meeting-room or to OSM will be used. -more-information: -# Optional. Must be a URL. +# Required. Must be an osm.org type + ID (e.g. node/13473395006) or the text 'online'. + +# Links on the events page: meeting-room: # Optional. Must be a URL. Link displayed on event page if "location: online". +more-information: +# Optional. Must be a URL. blog-post: # Optional. Must be the path of the blog post, starting with the year (e.g. 2022/10/translation-coordinator). +recording: +# Optional. Must be a URL. + +# Calendar links: +calendar-path: +# Required for recurring events. Path under https://calendar.antennapod.org, for example "community-call". +uid: +# Required for one-off events. Davis/Sabre event UID used to build the direct .ics download URL. + --- -Event description goes here. Displayed on the event detail page, and used for the body of the ICS calendar event. +Event description goes here. Displayed on the event detail page. diff --git a/_events/2022-07-22-10 year anniversary.md b/_events/2022-07-22-10 year anniversary.md index 776e3e983..afc4e6c54 100644 --- a/_events/2022-07-22-10 year anniversary.md +++ b/_events/2022-07-22-10 year anniversary.md @@ -1,13 +1,13 @@ --- title: 10 Year anniversary 🎉 -uid: c9c773d2-8106-4075-89b6-e071a1daedeb timezone: Europe/Brussels datetime-start: 2022-07-22 18:00 datetime-end: 2022-07-22 19:00 recurring: no location: online more-information: https://forum.antennapod.org/t/antennapod-10-years-anniversary-call-friday-at-18-00-6-pm-cest/2184 -meeting-room: https://meet.antennapod.org/10YearsAnniversary +meeting-room: 10YearsAnniversary +uid: c9c773d2-8106-4075-89b6-e071a1daedeb --- AntennaPod’s very first release was on 2012-07-22. This is also when the app was first uploaded to Google Play. AntennaPod is turning a decade old! diff --git a/_events/2026-01-31-fosdem.md b/_events/2026-01-31-fosdem.md index 6842d983e..ee301373b 100644 --- a/_events/2026-01-31-fosdem.md +++ b/_events/2026-01-31-fosdem.md @@ -1,13 +1,13 @@ --- title: FOSDEM meetup -uid: d9342ce0-e029-4fe4-805a-50fda92d2f4f +uid: 9223c695-e382-4ad5-9340-856388138ab3 timezone: Europe/Brussels datetime-start: 2026-01-31 19:30 -datetime-end: 2026-01-31 21:30 recurring: no more-information: https://forum.antennapod.org/t/antennapod-fosdem-2026/7923 image: brussels.jpg blog-post: 2026/02/fosdem +location: node/13473395006 --- Some core AntennaPod contributors plan to join the [FOSDEM](https://fosdem.org/2026/) conference in Brussels from the 31th of January to the 1st of February. We plan to grab some drinks together on Saturday at 19:30. To join, please leave a post on [our forum](https://forum.antennapod.org/t/antennapod-fosdem-2026/7923). diff --git a/_events/community-call.md b/_events/community-call.md new file mode 100644 index 000000000..684a6130c --- /dev/null +++ b/_events/community-call.md @@ -0,0 +1,15 @@ +--- +title: Monthly community call ☎ 🎙 +summary: Our monthly call to discuss anything AntennaPod (and beyond). Join us! +uid: 0718779a-5b92-48df-87e3-801e02154c06 +calendar-path: community-call +timezone: Europe/Brussels +datetime-start: 2022-04-09 18:00 +recurring: yes +recurrence-text: every-2nd-saturday +location: online +more-information: https://forum.antennapod.org/t/monthly-community-call/1869 +meeting-room: community-call +--- + +{% tf "events/{{ page.slug }}.md" %} diff --git a/_events/community-meeting.md b/_events/community-meeting.md deleted file mode 100644 index 5c5377132..000000000 --- a/_events/community-meeting.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Monthly community meeting ☎ 🎙 -summary: Our monthly meeting to discuss anything AntennaPod. Join us! -permalink: /events/:slug -uid: 0fc58c3c-517f-4467-b0e3-7e036cf1420c -sequence: 4 -timezone: Europe/Brussels -datetime-start: 2022-04-09 18:00 -datetime-end: 2022-04-09 19:00 -recurring: yes -recurrence-text: every-2nd-saturday -recurrence-rule: FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2 -recurrence-exceptions: -- 2022-10-08 -- 2023-06-10 -- 2023-07-08 -- 2023-08-12 -- 2023-09-09 -- 2024-08-10 -- 2025-11-08 -recurrence-additions: -- start: 2022-10-22 16:00 - end: 2022-10-22 17:00 -- start: 2023-06-17 18:00 - end: 2023-06-17 19:00 -- start: 2023-09-21 18:00 - end: 2023-09-21 19:00 -location: online -location-label: AntennaPod's Jitsi Meet -more-information: https://forum.antennapod.org/t/monthly-community-call/1869 -meeting-room: https://meet.antennapod.org/CommunityCall ---- - -{% tf "events/{{ page.slug }}.md" %} diff --git a/_events/needs-decision.md b/_events/needs-decision.md index 695a56e6b..aaf1169e5 100644 --- a/_events/needs-decision.md +++ b/_events/needs-decision.md @@ -1,27 +1,15 @@ --- title: "Needs: Decision - AntennaPod UX discussions" summary: A bi-weekly meeting where core contributors discuss feature requests & make tough choices. -permalink: /events/:slug -uid: TDL9-28GB-50YV-P6X4-D48Y -sequence: -# Optional. Defaults to 0 if left empty. Should be increased with 1 on every big event edit. +uid: dcb8867b-32a2-493f-8a43-60ff885028ed +calendar-path: needs-decision timezone: Europe/Brussels datetime-start: 2024-02-14 20:30 -datetime-end: 2024-02-14 21:30 recurring: yes recurrence-text: 2nd-4th-wednesday -recurrence-rule: FREQ=WEEKLY;INTERVAL=2;BYDAY=WE -recurrence-exceptions: -- 2024-07-02 -recurrence-additions: -# List of date-times on which the event is additionally taking place. -- start: 2023-12-28 21:00 - end: 2023-12-28 22:30 -- start: 2024-07-10 21:00 - end: 2024-07-10 22:30 location: online more-information: https://github.com/AntennaPod/AntennaPod/issues?q=state%3Aopen%20label%3A%22Needs%3A%20Decision%22 -meeting-room: https://meet.antennapod.org/needsdecision +meeting-room: needs-decision --- We are very careful about AntennaPod's User Experience (UX). The [project's goal](/about) here is to balance simplicity with feature-richness. Sometimes that requires some hard thinking on how to implement a feature request. diff --git a/_i18n/en.yml b/_i18n/en.yml index f7d100066..17c3a8a02 100644 --- a/_i18n/en.yml +++ b/_i18n/en.yml @@ -292,8 +292,10 @@ events: upcoming-events: "Upcoming Events" past-events: "Past Events" download-ics: "Download ICS file" - copy-url: "Copy calendar URL" - announce-add-calendar: "Always want to have the latest events and update community call information at hand? Then subscribe to our calendar in your favorite app via the 'Add to calendar' link!" + subscribe-event: "Copy event URL" + subscribe-all: "Copy URL for all events" + subscribe-ics: "Copy event URL (ICS)" + announce-add-calendar: "Always want to have the most up-to-date event information at hand? Copy the URL and add it as a remote calendar in your calendar app to add all our calls and meetings. Or use the ICS file to add just this event." links: add-calendar: "Add to calendar" more-information: "More information" diff --git a/_i18n/en/events/community-call.md b/_i18n/en/events/community-call.md new file mode 100644 index 000000000..c285950b7 --- /dev/null +++ b/_i18n/en/events/community-call.md @@ -0,0 +1,3 @@ +Every month we meet to discuss anything related to AntennaPod. From feature and enhancement suggestions by contributors, via usability questions and donation expense proposals, to branding updates. + +We’ll discuss and announce the next topics, and report back on what we discussed on the forum. \ No newline at end of file diff --git a/_i18n/en/events/community-meeting.md b/_i18n/en/events/community-meeting.md deleted file mode 100644 index 5095ed2a4..000000000 --- a/_i18n/en/events/community-meeting.md +++ /dev/null @@ -1,3 +0,0 @@ -Every month we meet to discuss anything related to AntennaPod. From feature and enhancement suggestions by contributors, via usability questions and donation expense proposals, to branding updates. - -We’ll discuss and announce the next topics, and report back on what we discussed on the forum. Do you want to receive a notification every now and then about the community calls? Then join the ['community callers' group on the forum](https://forum.antennapod.org/g/community-callers). The group will be tagged before and after the meetings, so you'll get a ping at each relevant update. diff --git a/_i18n/en/general/event-sidebar.md b/_i18n/en/general/event-sidebar.md index 12b66c121..123d3ccd0 100644 --- a/_i18n/en/general/event-sidebar.md +++ b/_i18n/en/general/event-sidebar.md @@ -6,4 +6,5 @@ Do you know of an event in your neighbourhood and would love to meet up with Ant [Propose a meet-up](https://forum.antennapod.org) -Add our events to your calendar +{% assign calendar_base_url = site.data.event-links | where: 'key', 'calendar-path' | map: 'url' | first %} +Add our events to your calendar \ No newline at end of file diff --git a/_i18n/en/general/events-add-calendar-modal.md b/_i18n/en/general/events-add-calendar-modal.md deleted file mode 100644 index 65b6539a3..000000000 --- a/_i18n/en/general/events-add-calendar-modal.md +++ /dev/null @@ -1,3 +0,0 @@ -Always want to have the latest community call dates and times in your calendar? Then copy the URL and add it as a remote calendar in your calendar app. - -Hope to see you! diff --git a/_includes/ICS-modal.html b/_includes/ICS-modal.html deleted file mode 100644 index ef11a736e..000000000 --- a/_includes/ICS-modal.html +++ /dev/null @@ -1,17 +0,0 @@ - diff --git a/_includes/add-to-calendar-modal.html b/_includes/add-to-calendar-modal.html new file mode 100644 index 000000000..6ccc34c46 --- /dev/null +++ b/_includes/add-to-calendar-modal.html @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/_includes/event-link-visible.html b/_includes/event-link-visible.html new file mode 100644 index 000000000..9687df399 --- /dev/null +++ b/_includes/event-link-visible.html @@ -0,0 +1,13 @@ +{%- if page[link.key] or link.key == 'calendar-path' -%} + {%- unless link.key == 'location' and page.location == 'online' -%} + {%- unless link.key == 'meeting-room' and page.location != 'online' -%} + {%- unless link.key == 'meeting-room' and status == 'past' -%} + {%- unless link.key == 'calendar-path' and page.recurring != true and page.uid == nil -%} + {%- unless link.key == 'calendar-path' and status == 'past' -%} + 1 + {%- endunless -%} + {%- endunless -%} + {%- endunless -%} + {%- endunless -%} + {%- endunless -%} +{%- endif -%} \ No newline at end of file diff --git a/_includes/share.html b/_includes/share.html index 8e2abdee6..52878eb4e 100644 --- a/_includes/share.html +++ b/_includes/share.html @@ -1,7 +1,7 @@
{%- assign author = site.data.authors[page.author] %}

{% t generic.share %}

- nowunix %} {% assign status = 'upcoming' %} {% else %} {% assign status = 'past' %} {% endif %} -{% endif %} +{%- endif -%}
@@ -44,46 +52,31 @@

{{ page.title }}

+ {% assign info_counter = 0 %} {% for link in site.data.event-links %} - {% if page[link.key] or link.key == 'ICS' %}{% unless page.location != 'online' and link.key == 'meeting-room' %}{% unless status == 'past' and link.key == 'meeting-room' %}{% unless status == 'past' and link.key == 'ICS' %}{% assign info_counter = info_counter | plus:1 %}{% endunless %}{% endunless %}{% endunless %}{% endif %} + {%- capture link_visibility %}{%- include event-link-visible.html -%}{%- endcapture -%} + {% if link_visibility != '' %} + {% assign info_counter = info_counter | plus: 1 %} + {% endif %} {% endfor %} - {% assign info_counter = info_counter | minus:1 %} - - - {%- if status != 'past' %} -
-
-

- {% t events.general.announce-add-calendar %} -

-
-
- {%- endif %}
-{% include ICS-modal.html %} +{% include add-to-calendar-modal.html %} diff --git a/_plugins/recurring_events_permalink.rb b/_plugins/recurring_events_permalink.rb new file mode 100644 index 000000000..321b7d7a0 --- /dev/null +++ b/_plugins/recurring_events_permalink.rb @@ -0,0 +1,18 @@ +# This generator assigns a stable permalink pattern to recurring events based on their slug when no permalink is explicitly defined in front matter. This ensures that the URLs for recurring events remain consistent over time and with the page slug and meeting room URL. +module Jekyll + class RecurringEventsPermalinkGenerator < Generator + safe true + priority :highest + + def generate(site) + events = site.collections['events'] + return unless events + + events.docs.each do |event| + if event.data['recurring'] && !event.data['permalink'] + event.data['permalink'] = '/events/:slug' + end + end + end + end +end \ No newline at end of file diff --git a/_sass/_custom.scss b/_sass/_custom.scss index c86868199..2cd739cb9 100644 --- a/_sass/_custom.scss +++ b/_sass/_custom.scss @@ -624,6 +624,18 @@ blockquote { padding-right: 1rem; } +.event-links-grid > .event-link-item { + border-left: 0; +} + +.event-links-grid > .event-link-item + .event-link-item { + border-left: $border-width solid var(--bs-border-color); +} + +.event-links-grid.row-cols-2 > .event-link-item:nth-child(2n + 1) { + border-left: 0; +} + // Boxes and Cards - Use Bootstrap's .card-img-top for images .project-card { background: var(--bs-tertiary-bg); diff --git a/assets/js/copy-url.js b/assets/js/copy-url.js index 373183631..f7ee939bc 100644 --- a/assets/js/copy-url.js +++ b/assets/js/copy-url.js @@ -1,9 +1,21 @@ -function copyUrl() { - let url = (event.target.value ==null) ? document.location.href:event.target.value; +function copyUrl(event) { + event?.preventDefault(); + const tooltipTrigger = event?.currentTarget; + const url = tooltipTrigger?.getAttribute('data-copy-url') + ?? tooltipTrigger?.value + ?? document.location.href; - navigator.clipboard.writeText(url).then(function() { - console.log('Copied!'); - }, function() { - console.log('Copy error') - }); -}; + if (!navigator.clipboard?.writeText) { + return; + } + + navigator.clipboard.writeText(url) + .then(function() { + if (tooltipTrigger?.dataset.bsToggle === 'tooltip' && window.bootstrap?.Tooltip) { + bootstrap.Tooltip.getOrCreateInstance(tooltipTrigger).show(); + } + }) + .catch(function() { + // Clipboard access can fail when permissions are denied. + }); +} diff --git a/assets/js/tooltip.js b/assets/js/tooltip.js index 9d9bda1fb..5fb84d853 100644 --- a/assets/js/tooltip.js +++ b/assets/js/tooltip.js @@ -1,18 +1,15 @@ // Initialize Bootstrap 5 tooltips -document.addEventListener('DOMContentLoaded', function() { - // Initialize all tooltips - var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); - var tooltipList = tooltipTriggerList.map(function(tooltipTriggerEl) { - return new bootstrap.Tooltip(tooltipTriggerEl); - }); +document.addEventListener('DOMContentLoaded', () => { + // Initialize regular (non-manual) tooltips. Manual tooltips are created on demand. + document.querySelectorAll('[data-bs-toggle="tooltip"]:not([data-bs-trigger="manual"])') + .forEach((tooltipTriggerEl) => { + new bootstrap.Tooltip(tooltipTriggerEl); + }); // Auto-hide tooltips after 1 second - document.addEventListener('shown.bs.tooltip', function(e) { - setTimeout(function() { - var tooltip = bootstrap.Tooltip.getInstance(e.target); - if (tooltip) { - tooltip.hide(); - } - }, 1000); - }); + document.addEventListener('shown.bs.tooltip', (e) => { + setTimeout(() => { + bootstrap.Tooltip.getInstance(e.target)?.hide(); + }, 1000); + }); }); diff --git a/events-with-RDATE.ics b/events-with-RDATE.ics deleted file mode 100644 index cc95f5fdd..000000000 --- a/events-with-RDATE.ics +++ /dev/null @@ -1,102 +0,0 @@ ---- -layout: null ---- -BEGIN:VCALENDAR -CALSCALE:GREGORIAN -VERSION:2.0 -PRODID:-//AntennaPod//Website events section 0.1//EN -LAST-MODIFIED:{{ 'now' | date: "%Y%m%dT%H%M00Z"}} -NAME:AntennaPod - -{%- assign recurringevents = site.events | sort: 'datetime-start' | reverse | where:"recurring", true %} -{%- assign normalevents = site.events | sort: 'datetime-start' | reverse | where:"recurring", false %} -{%- assign events = recurringevents | concat: normalevents %} - -{%- for event in events -%}{% if event.unlisted != true %} -BEGIN:VEVENT -DTSTAMP:{{ event.datetime-start | date: "%Y%m%dT%H%M00Z" }}{% if event.sequence %} -SEQUENCE:{{ event.sequence }}{% endif %} -UID:{{ event.uid | upcase }} -DTSTART -{%- if event.timezone -%};TZID={{ event.timezone }}{% endif %}: -{{- event.datetime-start | date: "%Y%m%dT%H%M00" }}{% unless event.timezone %}Z{% endunless %} -DTEND -{%- if event.timezone -%};TZID={{ event.timezone }}{% endif %}: -{{- event.datetime-end | date: "%Y%m%dT%H%M00" }}{% unless event.timezone %}Z{% endunless %} -STATUS:CONFIRMED -SUMMARY:{{ event.title }} - -{%- capture description %} -DESCRIPTION: -{{- event.content | remove_last: '

' | replace: '

','\n\n' | strip_html | replace:',','\,' | replace:':','\:' | replace:';','\;' | strip_newlines }} -{%- if event.location == 'online' %}{% if event.location-label %}\n\n{{ event.meeting-room }}{% endif %}{% endif %} -{%- endcapture %} -{%- assign description = description | replace: '\n\n\n\n','\n\n' %} - -{%- assign descriptionChars = description.size %} -{%- assign descriptionTotalRows = descriptionChars | divided_by: 74.00 | ceil %} -{%- assign descriptionChars = descriptionChars | plus: descriptionTotalRows %} -{%- assign descriptionTotalRows = descriptionChars | divided_by: 74.00 | ceil %} -{%- assign descriptionChars = descriptionChars | minus: descriptionTotalRows %} -{%- assign start = 0 %} -{%- assign separator = '\||/' %} -{%- assign descriptionWorker = '' %} - -{%- for rowToBe in (1..descriptionTotalRows) %} - {%- if descriptionChars <= 74 %} - {%- assign descriptionWorker = description %} - {%- break %} - {%- else %} - {%- assign descriptionRow = description | slice: start, 73 | prepend: ' ' | append: separator %} - {%- assign descriptionWorker = descriptionWorker | append: descriptionRow %} - {%- assign start = start | plus: 73 %} - {%- endif %} -{%- endfor %} - -{%- if descriptionChars > 74 %} - {%- assign descriptionWorker = descriptionWorker | lstrip %} - {%- assign lastChar = descriptionWorker.size | minus: separator.size %} - {%- assign descriptionWorker = descriptionWorker | slice: 0, lastChar %} - {%- assign descriptionArray = descriptionWorker | split: separator %} -{%- endif %} - -{%- for descriptionLine in descriptionArray %} -{{ descriptionLine }} -{%- endfor %} -LOCATION:{% if event.location-label %}{{ event.location-label }} -{%- elsif event.location == 'online' %}{{ event.meeting-room }} -{%- else %}{{ site.data.event-links[location].url }}{{ event.location }} -{%- endif %}{% if event.location == 'online' %} -URL:{{ event.meeting-room }} -CONFERENCE:{{ event.meeting-room }} -{%- endif %}{% if event.recurring == true %} -RRULE:{{ event.recurrence-rule -}} -{%- endif %}{% if event.recurrence-exceptions %} -EXDATE -{%- if event.timezone -%};TZID={{ event.timezone }}{% endif %}: -{%- for exception in event.recurrence-exceptions %} -{{- exception | date: "%Y%m%d" }}T{{ event.datetime-start | date: "%H%M00" }}{% unless event.timezone %}Z{% endunless %} -{%- unless forloop.last %},{% endunless %} -{%- endfor -%} -{%- endif %}{% if event.recurrence-additions %} -RDATE;VALUE=PERIOD -{%- if event.timezone -%};TZID={{ event.timezone }}{% endif %}: -{%- for extra-occurrence in event.recurrence-additions %} -{{- extra-occurrence.start | date: "%Y%m%dT%H%M00" }}{% unless event.timezone %}Z{% endunless %}/ -{{- extra-occurrence.end | date: "%Y%m%dT%H%M00" }}{% unless event.timezone %}Z{% endunless %} -{%- unless forloop.last %},{% endunless %} -{%- endfor -%} -{%- endif %} -END:VEVENT -{%- endif %} -{%- endfor %}{%- for timezone in site.data.ics-timezones %} -BEGIN:VTIMEZONE -TZID:{{ timezone[0] }} -{%- comment %} Following is unfortunately necessary to ensure that CRLF is used for EOL, as Jekyll uses LF when printing an array value in build process on Unix machine {% endcomment %} -{%- assign timezoneDefinitionArray = timezone[1] | split: ' ' %} -{%- for definitionLine in timezoneDefinitionArray %} -{{ definitionLine }} -{%- endfor %} -END:VTIMEZONE -{%- endfor %} -END:VCALENDAR diff --git a/events.ics b/events.ics deleted file mode 100644 index a4ee19f88..000000000 --- a/events.ics +++ /dev/null @@ -1,94 +0,0 @@ ---- -layout: null ---- -BEGIN:VCALENDAR -CALSCALE:GREGORIAN -VERSION:2.0 -PRODID:-//AntennaPod//Website events section 0.1//EN -LAST-MODIFIED:{{ 'now' | date: "%Y%m%dT%H%M00Z"}} -NAME:AntennaPod - -{%- assign recurringevents = site.events | sort: 'datetime-start' | reverse | where:"recurring", true %} -{%- assign normalevents = site.events | sort: 'datetime-start' | reverse | where:"recurring", false %} -{%- assign events = recurringevents | concat: normalevents %} - -{%- for event in events -%}{% if event.unlisted != true %} -BEGIN:VEVENT -DTSTAMP:{{ event.datetime-start | date: "%Y%m%dT%H%M00Z" }}{% if event.sequence %} -SEQUENCE:{{ event.sequence }}{% endif %} -UID:{{ event.uid | upcase }} -DTSTART -{%- if event.timezone -%};TZID={{ event.timezone }}{% endif %}: -{{- event.datetime-start | date: "%Y%m%dT%H%M00" }}{% unless event.timezone %}Z{% endunless %} -DTEND -{%- if event.timezone -%};TZID={{ event.timezone }}{% endif %}: -{{- event.datetime-end | date: "%Y%m%dT%H%M00" }}{% unless event.timezone %}Z{% endunless %} -STATUS:CONFIRMED -SUMMARY:{{ event.title }} - -{%- capture description %} -DESCRIPTION: -{{- event.content | remove_last: '

' | replace: '

','\n\n' | strip_html | replace:',','\,' | replace:':','\:' | replace:';','\;' | strip_newlines }} -{%- if event.location == 'online' %}{% if event.location-label %}\n\n{{ event.meeting-room }}{% endif %}{% endif %} -{%- endcapture %} -{%- assign description = description | replace: '\n\n\n\n','\n\n' %} - -{%- assign descriptionChars = description.size %} -{%- assign descriptionTotalRows = descriptionChars | divided_by: 74.00 | ceil %} -{%- assign descriptionChars = descriptionChars | plus: descriptionTotalRows %} -{%- assign descriptionTotalRows = descriptionChars | divided_by: 74.00 | ceil %} -{%- assign descriptionChars = descriptionChars | minus: descriptionTotalRows %} -{%- assign start = 0 %} -{%- assign separator = '\||/' %} -{%- assign descriptionWorker = '' %} - -{%- for rowToBe in (1..descriptionTotalRows) %} - {%- if descriptionChars <= 74 %} - {%- assign descriptionWorker = description %} - {%- break %} - {%- else %} - {%- assign descriptionRow = description | slice: start, 73 | prepend: ' ' | append: separator %} - {%- assign descriptionWorker = descriptionWorker | append: descriptionRow %} - {%- assign start = start | plus: 73 %} - {%- endif %} -{%- endfor %} - -{%- if descriptionChars > 74 %} - {%- assign descriptionWorker = descriptionWorker | lstrip %} - {%- assign lastChar = descriptionWorker.size | minus: separator.size %} - {%- assign descriptionWorker = descriptionWorker | slice: 0, lastChar %} - {%- assign descriptionArray = descriptionWorker | split: separator %} -{%- endif %} - -{%- for descriptionLine in descriptionArray %} -{{ descriptionLine }} -{%- endfor %} -LOCATION:{% if event.location-label %}{{ event.location-label }} -{%- elsif event.location == 'online' %}{{ event.meeting-room }} -{%- else %}{{ site.data.event-links[location].url }}{{ event.location }} -{%- endif %}{% if event.location == 'online' %} -URL:{{ event.meeting-room }} -CONFERENCE:{{ event.meeting-room }} -{%- endif %}{% if event.recurring == true %} -RRULE:{{ event.recurrence-rule -}} -{%- endif %}{% if event.recurrence-exceptions %} -EXDATE -{%- if event.timezone -%};TZID={{ event.timezone }}{% endif %}: -{%- for exception in event.recurrence-exceptions %} -{{- exception | date: "%Y%m%d" }}T{{ event.datetime-start | date: "%H%M00" }}{% unless event.timezone %}Z{% endunless %} -{%- unless forloop.last %},{% endunless %} -{%- endfor -%} -{%- endif %} -END:VEVENT -{%- endif %} -{%- endfor %}{%- for timezone in site.data.ics-timezones %} -BEGIN:VTIMEZONE -TZID:{{ timezone[0] }} -{%- comment %} Following is unfortunately necessary to ensure that CRLF is used for EOL, as Jekyll uses LF when printing an array value in build process on Unix machine {% endcomment %} -{%- assign timezoneDefinitionArray = timezone[1] | split: ' ' %} -{%- for definitionLine in timezoneDefinitionArray %} -{{ definitionLine }} -{%- endfor %} -END:VTIMEZONE -{%- endfor %} -END:VCALENDAR diff --git a/events/index.html b/events/index.html index 5dd30af1d..a9991e9f0 100644 --- a/events/index.html +++ b/events/index.html @@ -87,6 +87,4 @@

- - -{% include ICS-modal.html %} + \ No newline at end of file