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 +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +59 -0
- data/_config.yml +23 -0
- data/_includes/comments.html +18 -0
- data/_includes/custom-head.html +6 -0
- data/_includes/footer.html +32 -0
- data/_includes/google-analytics.html +8 -0
- data/_includes/head.html +14 -0
- data/_includes/header.html +20 -0
- data/_includes/nav-items.html +8 -0
- data/_includes/past_talk.html +15 -0
- data/_includes/social.html +22 -0
- data/_includes/sub-footer.html +4 -0
- data/_includes/talk.html +14 -0
- data/_layouts/base.html +22 -0
- data/_layouts/default.html +1 -0
- data/_layouts/home.html +76 -0
- data/_layouts/page.html +14 -0
- data/_layouts/post.html +50 -0
- data/_layouts/reading_seminar.html +45 -0
- data/_layouts/talk.html +40 -0
- data/_plugins/calendar.rb +59 -0
- data/_plugins/talks.rb +26 -0
- data/_sass/minima/_base.scss +296 -0
- data/_sass/minima/_layout.scss +418 -0
- data/_sass/minima/custom-styles.scss +2 -0
- data/_sass/minima/custom-variables.scss +1 -0
- data/_sass/minima/initialize.scss +51 -0
- data/_sass/minima/seminima.scss +26 -0
- data/_sass/minima/skins/auto.scss +399 -0
- data/_sass/minima/skins/classic.scss +5 -0
- data/_sass/minima/skins/dark.scss +5 -0
- data/_sass/minima/skins/solarized-dark.scss +5 -0
- data/_sass/minima/skins/solarized-light.scss +4 -0
- data/_sass/minima/skins/solarized.scss +258 -0
- data/assets/css/style.scss +7 -0
- metadata +155 -0
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>
|
data/_includes/head.html
ADDED
|
@@ -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>
|
data/_includes/talk.html
ADDED
|
@@ -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 }} —
|
|
13
|
+
Location: {{ talk.location }}</span>
|
|
14
|
+
</li>
|
data/_layouts/base.html
ADDED
|
@@ -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 }}
|
data/_layouts/home.html
ADDED
|
@@ -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>
|
data/_layouts/page.html
ADDED
data/_layouts/post.html
ADDED
|
@@ -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>
|
data/_layouts/talk.html
ADDED
|
@@ -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 -%}— <span>Time: {{ page.start_time }}</span>{%- endif -%} {%- if page.location -%} — <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)
|