seminima 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6df4b3e235d15f803d8c3a5625b2803d1c368d821725a3defe286990ff5f8214
4
+ data.tar.gz: 4f3e33976b616d6cdd27c324cd9018d9c9392c981a0cc3328b4f7a603b5fa75b
5
+ SHA512:
6
+ metadata.gz: 92cdfc46800f759fd2cd50ae7c313aecd29a3442d256ce19211106b4c02c2d3eb5862b060177ff9f16a2a00591ddf8fc7cb33da4e38d90013e17012ad012eea7
7
+ data.tar.gz: 897ae71dc76457494689d7e1ad13a53ee3192099ddc54900e2aa12fbcbc2bd93dc2c5e65315d593ed5f003fe0182fe55fec7972bb1f6141fc332e5bdba24f178
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2025
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # seminima
2
+
3
+ This is a [Minima][minima]-based theme for [Jekyll][jekyll]. It is developed specifically for use as a theme for websites for seminars hosted in the academic world.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your Jekyll site's `Gemfile`:
8
+
9
+ ```ruby
10
+ gem "seminima"
11
+ ```
12
+
13
+ And add this line to your Jekyll site's `_config.yml`:
14
+
15
+ ```yaml
16
+ theme: seminima
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install seminima
26
+
27
+ ## Usage
28
+
29
+ ### Configuration
30
+ This repository uses Nix. To prevent the Nix files from being exposed online at build time add the following to your `_config.yml`:
31
+
32
+ ```yaml
33
+ exclude:
34
+ - gemset.nix
35
+ - flake.nix
36
+ - flake.lock
37
+ ```
38
+
39
+ TODO: Write usage instructions here. Describe your available layouts, includes, sass and/or assets.
40
+
41
+ ## Contributing
42
+
43
+ Bug reports and pull requests are welcome on GitHub at https://github.com/seminar-tools/seminima. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](https://www.contributor-covenant.org/) code of conduct.
44
+
45
+ ## Development
46
+
47
+ To set up your environment to develop this theme, run `bundle install`.
48
+
49
+ Your theme is setup just like a normal Jekyll site! To test your theme, run `bundle exec jekyll serve` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme. Add pages, documents, data, etc. like normal to test your theme's contents. As you make modifications to your theme and to your content, your site will regenerate and you should see the changes in the browser after a refresh, just like normal.
50
+
51
+ When your theme is released, only the files in `_layouts`, `_includes`, `_sass` and `assets` tracked with Git will be bundled.
52
+ To add a custom directory to your theme-gem, please edit the regexp in `seminima.gemspec` accordingly.
53
+
54
+ ## License
55
+
56
+ The theme is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
57
+
58
+ [minima]: https://github.com/jekyll/minima
59
+ [jekyll]: https://jekyllrb.com/
data/_config.yml ADDED
@@ -0,0 +1,23 @@
1
+ title: Seminima Example
2
+
3
+ author:
4
+ name: Douwe Hoekstra
5
+ email: dev@dhoekstra.xyz
6
+
7
+ theme: seminima
8
+
9
+ plugins:
10
+ - jekyll-seo-tag
11
+ - jekyll-feed
12
+
13
+ # The seminima presupposes the existence of these collections
14
+ collections:
15
+ reading_seminars:
16
+ output: true
17
+ talks:
18
+ output: true
19
+
20
+ exclude:
21
+ - gemset.nix
22
+ - flake.nix
23
+ - flake.lock
@@ -0,0 +1,18 @@
1
+ {% if site.disqus.shortname -%}
2
+ <div id="disqus_thread"></div>
3
+ <script>
4
+ var disqus_config = function () {
5
+ this.page.url = '{{ page.url | absolute_url }}';
6
+ this.page.identifier = '{{ page.id }}';
7
+ };
8
+ (function() {
9
+ var d = document, s = d.createElement('script');
10
+ s.src = 'https://{{ site.disqus.shortname }}.disqus.com/embed.js';
11
+ s.setAttribute('data-timestamp', +new Date());
12
+ (d.head || d.body).appendChild(s);
13
+ })();
14
+ </script>
15
+ <noscript>
16
+ Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a>
17
+ </noscript>
18
+ {% endif -%}
@@ -0,0 +1,6 @@
1
+ {% comment %}
2
+ Placeholder to allow defining custom head, in principle, you can add anything here, e.g. favicons:
3
+
4
+ 1. Head over to https://realfavicongenerator.net/ to add your own favicons.
5
+ 2. Customize default _includes/custom-head.html in your source directory and insert the given code snippet.
6
+ {% endcomment %}
@@ -0,0 +1,32 @@
1
+ <link id="fa-stylesheet" rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@7.0.0/css/all.min.css">
2
+
3
+ <footer class="site-footer h-card">
4
+ <data class="u-url" value="{{ '/' | relative_url }}"></data>
5
+
6
+ <div class="wrapper">
7
+
8
+ <div class="footer-col-wrapper">
9
+ <div class="footer-col">
10
+ {%- if site.author %}
11
+ <ul class="contact-list">
12
+ {% if site.author.name -%}
13
+ <li class="p-name">{{ site.author.name | escape }}</li>
14
+ {% endif -%}
15
+ {% if site.author.email -%}
16
+ <li><a class="u-email" href="mailto:{{ site.author.email }}">{{ site.author.email }}</a></li>
17
+ {%- endif %}
18
+ </ul>
19
+ {%- endif %}
20
+ </div>
21
+ <div class="footer-col">
22
+ <p>{{ site.description | escape }}</p>
23
+ </div>
24
+ </div>
25
+
26
+ <div class="social-links">
27
+ {%- include social.html -%}
28
+ </div>
29
+
30
+ </div>
31
+
32
+ </footer>
@@ -0,0 +1,8 @@
1
+ <script async src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}"></script>
2
+ <script>
3
+ window.dataLayer = window.dataLayer || [];
4
+ function gtag(){window.dataLayer.push(arguments);}
5
+ gtag('js', new Date());
6
+
7
+ gtag('config', '{{ site.google_analytics }}');
8
+ </script>
@@ -0,0 +1,14 @@
1
+ <head>
2
+ <meta charset="utf-8">
3
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
4
+ <meta name="viewport" content="width=device-width, initial-scale=1">
5
+ {%- seo -%}
6
+ <link id="main-stylesheet" rel="stylesheet" href="{{ '/assets/css/style.css' | relative_url }}">
7
+ {%- feed_meta -%}
8
+ {%- if jekyll.environment == 'production' and site.google_analytics -%}
9
+ {%- include google-analytics.html -%}
10
+ {%- endif -%}
11
+
12
+ {%- include custom-head.html -%}
13
+
14
+ </head>
@@ -0,0 +1,20 @@
1
+ <header class="site-header">
2
+
3
+ <div class="wrapper">
4
+ {%- assign default_paths = site.pages | map: "path" -%}
5
+ {%- assign page_paths = site.minima.nav_pages | default: default_paths -%}
6
+ {%- assign page_titles = site.pages | map: 'title' | compact %}
7
+ <a class="site-title" rel="author" href="{{ '/' | relative_url }}">{{ site.title | escape }}</a>
8
+
9
+ {%- unless page_titles == empty %}
10
+ <nav class="site-nav">
11
+ <input type="checkbox" id="nav-trigger" />
12
+ <label for="nav-trigger">
13
+ <span class="menu-icon"></span>
14
+ </label>
15
+
16
+ {% include nav-items.html paths = page_paths %}
17
+ </nav>
18
+ {%- endunless %}
19
+ </div>
20
+ </header>
@@ -0,0 +1,8 @@
1
+ <div class="nav-items">
2
+ {%- for path in include.paths -%}
3
+ {%- assign hyperpage = site.pages | where: "path", path | first -%}
4
+ {%- if hyperpage.title %}
5
+ <a class="nav-item" href="{{ hyperpage.url | relative_url }}">{{ hyperpage.title | escape }}</a>
6
+ {%- endif -%}
7
+ {%- endfor %}
8
+ </div>
@@ -0,0 +1,15 @@
1
+ {% assign talk = include.talk %}
2
+ <li>
3
+ <span class="talk-meta">{{ talk.date | date: date_format }}
4
+ {%- if talk.seminar -%}
5
+ {% assign seminar = site.reading_seminars | where: "key", talk.seminar | first %}
6
+ | {{ seminar.title }}
7
+ {%- endif -%}
8
+ </span>
9
+ <h3 class="talk-header">
10
+ <a class="post-link" href="{{ talk.url | relative_url }}">
11
+ {{ talk.speaker }} - {{ talk.title }}
12
+ </a>
13
+ </h3>
14
+ {%- if talk.video_url -%}<span class="talk-info"><a href="{{ talk.video_url }}">Video</a></span>{%- endif -%}{%- if talk.slides_url -%}<span class="talk-info"><a href="{{ talk.slides_url }}">Slides</a></span>{%- endif -%}{%- if talk.notes_url -%}<span class="talk-info"><a href="{{ talk.notes_url }}">Notes</a></span>{%- endif -%}
15
+ </li>
@@ -0,0 +1,22 @@
1
+ <ul class="social-media-list">
2
+ {%- for entry in site.minima.social_links -%}
3
+ <li>
4
+ <a rel="me" href="{{ entry.url }}" target="_blank" title="{{ entry.title }}">
5
+ <span class="grey fa-brands fa-{{ entry.icon }} fa-lg"></span>
6
+ </a>
7
+ </li>
8
+ {%- endfor -%}
9
+ {% unless site.minima.hide_site_feed_link %}
10
+ <li>
11
+ <a href="{{ site.feed.path | default: 'feed.xml' | absolute_url }}" target="_blank" title="Subscribe to syndication feed">
12
+ <svg class="svg-icon grey" viewbox="0 0 16 16">
13
+ <path d="M12.8 16C12.8 8.978 7.022 3.2 0 3.2V0c8.777 0 16 7.223 16 16h-3.2zM2.194
14
+ 11.61c1.21 0 2.195.985 2.195 2.196 0 1.21-.99 2.194-2.2 2.194C.98 16 0 15.017 0
15
+ 13.806c0-1.21.983-2.195 2.194-2.195zM10.606
16
+ 16h-3.11c0-4.113-3.383-7.497-7.496-7.497v-3.11c5.818 0 10.606 4.79 10.606 10.607z"
17
+ />
18
+ </svg>
19
+ </a>
20
+ </li>
21
+ {%- endunless %}
22
+ </ul>
@@ -0,0 +1,4 @@
1
+ {% comment %}
2
+ Use this to insert markup before the closing body tag.
3
+ For example, scripts that need to be executed after the document has finished loading.
4
+ {% endcomment %}
@@ -0,0 +1,14 @@
1
+ <li>
2
+ <span class="talk-meta">{{ talk.date | date: date_format }}
3
+ {%- if talk.seminar -%} {% assign seminar = site.reading_seminars |
4
+ where: "key", talk.seminar | first %} | {{ seminar.title }} {%- endif
5
+ -%}
6
+ </span>
7
+ <h3 class="talk-header">
8
+ <a class="post-link" href="{{ talk.url | relative_url }}">
9
+ {{ talk.speaker }} - {{ talk.title }}
10
+ </a>
11
+ </h3>
12
+ <span class="talk-info">Time: {{ talk.start_time }} &mdash;
13
+ Location: {{ talk.location }}</span>
14
+ </li>
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE html>
2
+ <html lang="{{ page.lang | default: site.lang | default: 'en' }}">
3
+
4
+ {%- include head.html -%}
5
+
6
+ <body>
7
+
8
+ {%- include header.html -%}
9
+
10
+ <main class="page-content" aria-label="Content">
11
+ <div class="wrapper">
12
+ {{ content }}
13
+ </div>
14
+ </main>
15
+
16
+ {%- include footer.html -%}
17
+
18
+ {%- include sub-footer.html -%}
19
+
20
+ </body>
21
+
22
+ </html>
@@ -0,0 +1 @@
1
+ {{ content }}
@@ -0,0 +1,76 @@
1
+ ---
2
+ layout: base
3
+ ---
4
+
5
+ <div class="home">
6
+ {%- if page.title -%}
7
+ <h1 class="page-heading">{{ page.title }}</h1>
8
+ {%- endif -%}
9
+
10
+ {{ content }}
11
+
12
+
13
+ {% if site.paginate %}
14
+ {% assign posts = paginator.posts %}
15
+ {% else %}
16
+ {% assign posts = site.posts %}
17
+ {% endif %}
18
+
19
+ {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
20
+
21
+ {% assign current_posts = site.posts | where: "active", true %}
22
+ {%- if current_posts.size > 0 -%}
23
+ <h2 class="post-list-heading">{{ page.list_title | default: "General announcements" }}</h2>
24
+ <ul class="post-list">
25
+ {%- for post in current_posts -%}
26
+ <li>
27
+ <span class="post-meta">{{ post.date | date: date_format }}</span>
28
+ <h3>
29
+ <a class="post-link" href="{{ post.url | relative_url }}">
30
+ {{ post.title | escape }}
31
+ </a>
32
+ </h3>
33
+ {%- if site.show_excerpts -%}
34
+ {{ post.excerpt }}
35
+ {%- endif -%}
36
+ </li>
37
+ {%- endfor -%}
38
+ </ul>
39
+ {%- endif -%}
40
+
41
+ {% assign current_reading_seminars = site.reading_seminars | where: "active", true %}
42
+ {%- if current_reading_seminars.size > 0 -%}
43
+ <h2 class="post-list-heading">Current reading seminar(s)</h2>
44
+ <ul class="post-list">
45
+ {%- for post in current_reading_seminars -%}
46
+ <li>
47
+ <h3>
48
+ <a class="post-link" href="{{ post.url | relative_url }}">
49
+ {{ post.title | escape }}
50
+ </a>
51
+ </h3>
52
+ </li>
53
+ {%- endfor -%}
54
+ </ul>
55
+ {%- endif -%}
56
+
57
+ {% assign future_talks = site.talks | in_future | sort: "date" %}
58
+ {%- if future_talks.size > 0 -%}
59
+ <h2 class="post-list-heading">Upcoming Talks</h2>
60
+ <ul class="post-list">
61
+ {%- for talk in future_talks limit: 5 -%}
62
+ {% include talk.html talk=talk %}
63
+ {%- endfor -%}
64
+ </ul>
65
+ {%- endif -%}
66
+
67
+ {%- assign previous_talks = site.talks | in_past | sort: "date" | reverse %}
68
+ {%- if previous_talks.size > 0 -%}
69
+ <h2 class="post-list-heading">Previous Talks</h2>
70
+ <ul class="post-list">
71
+ {%- for talk in previous_talks limit: 5 -%}
72
+ {% include past_talk.html talk=talk %}
73
+ {%- endfor -%}
74
+ </ul>
75
+ {%- endif -%}
76
+ </div>
@@ -0,0 +1,14 @@
1
+ ---
2
+ layout: base
3
+ ---
4
+ <article class="post">
5
+
6
+ <header class="post-header">
7
+ <h1 class="post-title">{{ page.title | escape }}</h1>
8
+ </header>
9
+
10
+ <div class="post-content">
11
+ {{ content }}
12
+ </div>
13
+
14
+ </article>
@@ -0,0 +1,50 @@
1
+ ---
2
+ layout: base
3
+ ---
4
+ <article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
5
+
6
+ <header class="post-header">
7
+ <h1 class="post-title p-name" itemprop="name headline">{{ page.title | escape }}</h1>
8
+ <div class="post-meta">
9
+ {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
10
+ {% assign pdate = page.date | date_to_xmlschema %}
11
+ {%- if page.modified_date %}<span class="meta-label">Published:</span>{% endif %}
12
+ <time class="dt-published" datetime="{{ pdate }}" itemprop="datePublished">
13
+ {{ pdate | date: date_format }}
14
+ </time>
15
+ {%- if page.modified_date -%}
16
+ <span class="bullet-divider">•</span>
17
+ <span class="meta-label">Updated:</span>
18
+ {%- assign mdate = page.modified_date | date_to_xmlschema %}
19
+ <time class="dt-modified" datetime="{{ mdate }}" itemprop="dateModified">
20
+ {{ mdate | date: date_format }}
21
+ </time>
22
+ {%- endif -%}
23
+ {%- if page.author %}
24
+ <div class="{% unless page.modified_date %}force-inline {% endunless %}post-authors">
25
+ {%- for author in page.author %}
26
+ <span itemprop="author" itemscope itemtype="http://schema.org/Person">
27
+ <span class="p-author h-card" itemprop="name">{{ author }}</span></span>
28
+ {%- if forloop.last == false %}, {% endif -%}
29
+ {% endfor %}
30
+ </div>
31
+ {%- endif %}
32
+ </div>
33
+ </header>
34
+
35
+ <div class="post-content e-content" itemprop="articleBody">
36
+ {{ content }}
37
+ </div>
38
+
39
+ {% if jekyll.environment == 'production' -%}
40
+ {% if page.comments == false -%}
41
+ <div class="comments-disabled-message">
42
+ Comments have been disabled for this post.
43
+ </div>
44
+ {% else -%}
45
+ {%- include comments.html -%}
46
+ {% endif -%}
47
+ {% endif -%}
48
+
49
+ <a class="u-url" href="{{ page.url | relative_url }}" hidden></a>
50
+ </article>
@@ -0,0 +1,45 @@
1
+ ---
2
+ layout: base
3
+ ---
4
+ <article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
5
+
6
+ <header class="post-header">
7
+ <h1 class="post-title p-name" itemprop="name headline">Reading seminar: {{ page.title | escape }}</h1>
8
+ </header>
9
+ <div class="post-content">
10
+ {{ content }}
11
+ {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
12
+ {%- if page.active -%}
13
+ {% assign seminar_talks = site.talks | where:
14
+ "seminar", page.key %}
15
+ {% assign future_talks = seminar_talks | in_future | sort: "date" %}
16
+ {%- if future_talks.size > 0 -%}
17
+ <h2 class="post-list-heading">Upcoming Talks</h2>
18
+ <ul class="post-list">
19
+ {%- for talk in future_talks limit: 5 -%}
20
+ {% include talk.html talk=talk %}
21
+ {%- endfor -%}
22
+ </ul>
23
+ {%- endif -%}
24
+
25
+ {%- assign previous_talks = seminar_talks | in_past | sort: "date" | reverse %}
26
+ {%- if previous_talks.size > 0 -%}
27
+ <h2 class="post-list-heading">Previous Talks</h2>
28
+ <ul class="post-list">
29
+ {%- for talk in previous_talks limit: 5 -%}
30
+ {% include past_talk.html talk=talk %}
31
+ {%- endfor -%}
32
+ </ul>
33
+ {%- endif -%}
34
+
35
+ {%- else -%}
36
+ <h2>Talks</h2>
37
+ {% assign seminar_talks = site.talks | where:
38
+ "seminar", page.key | sort: "date" %}
39
+ <ul class="post-list">
40
+ {%- for talk in seminar_talks -%} {% include past_talk.html talk=talk %} {%- endfor -%}
41
+ </ul>
42
+ {%- endif -%}
43
+ </div>
44
+
45
+ </article>
@@ -0,0 +1,40 @@
1
+ ---
2
+ layout: base
3
+ ---
4
+ <article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
5
+
6
+ <header class="post-header">
7
+ <span class="talk-speaker">{{ page.speaker }} {% if page.affiliation %}({{page.affiliation}}){% endif %}</span>
8
+ <h1 class="post-title p-name" itemprop="name headline">{{ page.title | escape }}</h1>
9
+ <p class="talk-page-info">
10
+ <time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
11
+ {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
12
+ {{ page.date | date: date_format }}
13
+ </time>
14
+ {%- if page.start_time -%}&mdash; <span>Time: {{ page.start_time }}</span>{%- endif -%} {%- if page.location -%}&nbsp;&mdash; <span>Location: {{ page.location }}</span>{%- endif -%}<br/>{% if page.video_url %}
15
+ <a class="talk-url" href="{{ page.video_url }}">Video</a>
16
+ {% endif %}
17
+ {% if page.slides_url %}
18
+ <a class="talk-url" href="{{ page.slides_url }}">Slides</a>
19
+ {% endif %}
20
+ {% if page.notes_url %}
21
+ <a class="talk-url" href="{{ page.notes_url }}">Notes</a>
22
+ {% endif %}</p>
23
+ </header>
24
+
25
+ <div class="post-content">
26
+ {%- if page.seminar -%}
27
+ <p>This talk is part of the following reading seminar:
28
+ {% assign seminar = site.reading_seminars | where: "key", page.seminar | first %}
29
+ <a href="{{ seminar.url }}">{{ seminar.title }}</a>.
30
+ </p>
31
+ {%- endif -%}
32
+
33
+ <h2>Abstract</h2>
34
+ <p>{{ page.abstract }}</p>
35
+
36
+ {{ content }}
37
+ </div>
38
+
39
+ <a class="u-url" href="{{ page.url | relative_url }}" hidden></a>
40
+ </article>
@@ -0,0 +1,59 @@
1
+ require 'jekyll'
2
+ require 'icalendar'
3
+ require 'icalendar/tzinfo'
4
+ require 'time'
5
+ require 'tzinfo'
6
+ require 'securerandom'
7
+
8
+ module Jekyll
9
+ class ICalendarGenerator < Jekyll::Generator
10
+ def make_calendar(site, config)
11
+
12
+ cal = Icalendar::Calendar.new
13
+
14
+ tzid = "Europe/Amsterdam"
15
+ tz = TZInfo::Timezone.get(tzid)
16
+ timezone = tz.ical_timezone Time.now
17
+ cal.add_timezone timezone
18
+
19
+ upcoming_talks = site.collections['talks'].docs.select do |talk|
20
+ date = talk.data["talk_date"]
21
+ if date.is_a?(String)
22
+ date = Date.parse(date)
23
+ end
24
+ date >= Date.today
25
+ end
26
+ upcoming_talks.each do |talk|
27
+ cal.event do |e|
28
+ date = talk.data["talk_date"]
29
+ if date.is_a?(String)
30
+ date = Date.parse(date)
31
+ end
32
+ e.uid = SecureRandom.uuid
33
+ zone = TZInfo::Timezone.get("Europe/Amsterdam")
34
+ start_hour, start_min = talk.data["start_time"].split(":").map(&:to_i)
35
+ end_hour, end_min = talk.data["end_time"].split(":").map(&:to_i)
36
+ start_time = Time.new(date.year, date.month, date.day, start_hour, start_min, 0)
37
+ end_time = Time.new(date.year, date.month, date.day, end_hour, end_min, 0)
38
+ e.dtstart = Icalendar::Values::DateTime.new start_time, 'tzid' => tzid
39
+ e.dtend = Icalendar::Values::DateTime.new end_time, 'tzid' => tzid
40
+ e.summary = talk.data['speaker'] + ": " + talk.data['title']
41
+ e.description = talk.data['abstract']
42
+ e.location = talk.data['location']
43
+ e.url = talk.data['redirectURL']
44
+ end
45
+ end
46
+
47
+ cal
48
+ end
49
+
50
+ def generate(site)
51
+ calendar = make_calendar site, {}
52
+
53
+ PageWithoutAFile.new(site, __dir__, "", "calendar.ics").tap do |file|
54
+ file.content = calendar.to_ical
55
+ site.pages << file
56
+ end
57
+ end
58
+ end
59
+ end
data/_plugins/talks.rb ADDED
@@ -0,0 +1,26 @@
1
+ module Jekyll
2
+ module DateFilter
3
+ def in_future(input)
4
+ today = Date.today
5
+ input.select do |item|
6
+ date = item.talk_date
7
+ if date.is_a?(String)
8
+ date = Date.parse(date)
9
+ end
10
+ date >= today
11
+ end
12
+ end
13
+ def in_past(input)
14
+ today = Date.today
15
+ input.select do |item|
16
+ date = item.talk_date
17
+ if date.is_a?(String)
18
+ date = Date.parse(date)
19
+ end
20
+ date < today
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ Liquid::Template.register_filter(Jekyll::DateFilter)