jekyll-theme-conference 3.1.5 → 3.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +94 -18
- data/_includes/js/conference-live.js +75 -56
- data/_includes/js/conference-map.js +3 -3
- data/_includes/js/conference.js +2 -1
- data/_includes/partials/checks.html +1 -1
- data/_includes/partials/get_day_time.html +4 -2
- data/_includes/partials/get_enable_map.html +11 -0
- data/_includes/partials/get_page_description.html +23 -0
- data/_includes/partials/get_page_title.html +33 -0
- data/_includes/partials/get_talk_time.html +18 -3
- data/_includes/partials/get_talk_timestamp.html +9 -4
- data/_includes/partials/header.html +6 -3
- data/_includes/partials/list_page_meta.html +23 -0
- data/_includes/partials/list_speakers.html +11 -5
- data/_includes/partials/modal_live.html +3 -2
- data/_includes/partials/navbar_rooms.html +5 -1
- data/_layouts/data.html +17 -0
- data/_layouts/location.html +1 -1
- data/_layouts/page.html +4 -0
- data/_layouts/program.html +14 -5
- data/_layouts/stream-overview.html +1 -1
- metadata +9 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2ae0a8593b5af0caa18dddfbb46fc921b089d9f932ba6c3af44d787669c99c0
|
4
|
+
data.tar.gz: de8cf5e47442a94d1f411ad6309cfd3d4ae2f964e341e4f9b1f47e14de7eca1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d347ca521f8ff60e328e9d6e1b0fa1557d78ac4dfd598f681ca2f3aba9683ea95d31b8d053295d5fd5cbe8c8cc7f56628a25b4eaf1a7149696b1611d6e1d84c
|
7
|
+
data.tar.gz: 6ef6506cb582b1620e4fa78b13b561b129076c208b2ca98993ea20c83faf77f12f2d28706dbac7a2cc944311133d585ce19b95dcd6cebfd44991b6f632de83fd
|
data/README.md
CHANGED
@@ -32,24 +32,27 @@ The theme was originally created for the yearly Winterkongress conference of the
|
|
32
32
|
* [Collection URLs](#collection-urls)
|
33
33
|
* [Language](#language)
|
34
34
|
* [Navigation Bar](#navigation-bar)
|
35
|
+
* [Open Graph Link Preview](#open-graph-link-preview)
|
35
36
|
* [Main Landing Page](#main-landing-page)
|
36
37
|
* [Information Boxes](#information-boxes)
|
37
|
-
* [Live Indications & Streaming](#live-indications
|
38
|
+
* [Live Indications & Streaming](#live-indications--streaming)
|
39
|
+
* [Map](#map)
|
38
40
|
* [Talk Settings](#talk-settings)
|
39
41
|
* [Speaker Settings](#speaker-settings)
|
40
42
|
* [Location Settings](#location-settings)
|
41
43
|
* [Program Settings](#program-settings)
|
42
44
|
- [Content](#content)
|
43
|
-
* [Schedule / Program](#schedule
|
45
|
+
* [Schedule / Program](#schedule--program)
|
44
46
|
* [Talks](#talks)
|
45
47
|
* [Speakers](#speakers)
|
46
48
|
* [Rooms](#rooms)
|
47
49
|
* [Links](#links)
|
48
50
|
- [Overview Pages](#overview-pages)
|
49
|
-
* [Location / Room Overview](#location
|
51
|
+
* [Location / Room Overview](#location--room-overview)
|
50
52
|
* [Live Stream Overview](#live-stream-overview)
|
51
53
|
* [Additional Pages](#additional-pages)
|
52
54
|
- [Design](#design)
|
55
|
+
- [Development](#development)
|
53
56
|
- [License](#license)
|
54
57
|
|
55
58
|
|
@@ -137,9 +140,9 @@ In order to be up and running simply use the default content of this repository
|
|
137
140
|
|
138
141
|
### Automatic Import
|
139
142
|
|
140
|
-
There exists a Python file in this repository, `_tools/create_entries.py`, which can be used to import content from a [frab](https://github.com/frab/frab/wiki/Manual#introduction) compatible JSON file (e.g. from [pretalx.com](https://pretalx.com/p/about/)) or a CSV table and generate the different talk, speakers and room files automatically.
|
143
|
+
There exists a Python file in this repository, `_tools/create_entries.py`, which can be used to import content from a [frab](https://github.com/frab/frab/wiki/Manual#introduction) compatible JSON file (e.g. from [pretalx.com](https://pretalx.com/p/about/)) or a CSV table and generate the different talk, speakers and room files automatically.
|
141
144
|
|
142
|
-
1. Copy the
|
145
|
+
1. Copy the files `_tools/create_entries.py` and `_tools/requirements.txt` from this repository
|
143
146
|
|
144
147
|
2. Create a virtual environment and activate it
|
145
148
|
|
@@ -148,10 +151,10 @@ There exists a Python file in this repository, `_tools/create_entries.py`, which
|
|
148
151
|
source venv/bin/activate
|
149
152
|
```
|
150
153
|
|
151
|
-
3. Install
|
154
|
+
3. Install the requirements
|
152
155
|
|
153
156
|
```bash
|
154
|
-
pip install
|
157
|
+
pip install -r _tools/requirements.txt
|
155
158
|
```
|
156
159
|
|
157
160
|
4. Execute the script, e.g. to show the help type
|
@@ -167,7 +170,7 @@ In case you do not want to install the entire Ruby/Jekyll toolchain on your mach
|
|
167
170
|
|
168
171
|
- `build.yml`: automatically builds and minimizes the website upon adding a new tag starting with a `v` (e.g. `v2020.01.01`). It then attaches the generated website as an archive to a release for easy downloading. Requires `purgecss.config.js` to be copied to the project's root too.
|
169
172
|
- `test.yml`: automatically tries to build the website upon a new pull request. It can thus be used as status check before merging.
|
170
|
-
- `schedule.yml`: automatically generates the schedule and content files when a new pull request contains a `schedule.json` file (see the _Automatic
|
173
|
+
- `schedule.yml`: automatically generates the schedule and content files when a new pull request contains a `schedule.json` file (see the _Automatic Import_ subsection above). Thus, it allows quick updates of the site's content from [pretalx.com](https://pretalx.com/p/about/) exports.
|
171
174
|
|
172
175
|
To get started, simply copy the desired workflow file to your repository and adapt it to your needs:
|
173
176
|
|
@@ -281,9 +284,32 @@ conference:
|
|
281
284
|
...
|
282
285
|
logo:
|
283
286
|
name: Magic Organisation
|
287
|
+
img: 'logo.svg' # inside /assets/images/
|
284
288
|
url: 'https://github.com'
|
285
289
|
```
|
286
290
|
|
291
|
+
### Open Graph Link Preview
|
292
|
+
|
293
|
+
The theme automatically includes the necessary `<meta>` tags to ease link previewing when sharing links based on the [Open Graph protocol](https://ogp.me/) and [Twitter Cards](https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards). These tags control how a link is presented when shared via different platform and apps. In order to disable these `<meta>` tags add the `disable: true` setting (default: `false`) to the `link_preview` property.
|
294
|
+
|
295
|
+
In order to generate a meaningful description for each of the links, the preposition for the conference title as given under the `title` property can be defined by using the `preposition` property. For example, if `title` is set to "Conference 2020" the corresponding `preposition` would be "at". The template can then use it to generate descriptions such as "Talk *at* Conference 2020".
|
296
|
+
|
297
|
+
Optionally, an image which is shown as preview for all links can be specified. For sharing via Open Graph an image ratio of 1.91:1 and an ideal size of 1200x630 pixel is recommended. For sharing via Twitter an image ratio of 1:1 and a minimal size of 600x600 pixel (better 1200x1200 pixel) is recommended. SVG image files are not supported. It is activate through the `img` property under the `link_preview` property containing an image file shown for Open Graph (`open_graph`) and on the Twitter Cards (`twitter`), whereby the path to the image file relative to the `/assets/images/` folder has to be specified.
|
298
|
+
|
299
|
+
```yaml
|
300
|
+
title: Conference 2020
|
301
|
+
preposition: 'at'
|
302
|
+
|
303
|
+
...
|
304
|
+
|
305
|
+
conference:
|
306
|
+
link_preview:
|
307
|
+
disable: false
|
308
|
+
img:
|
309
|
+
twitter: 'twitter_preview.png' # inside /assets/images/
|
310
|
+
open_graph: 'facebook_preview.png' # inside /assets/images/
|
311
|
+
```
|
312
|
+
|
287
313
|
### Main Landing Page
|
288
314
|
|
289
315
|
The main landing page is shown at the root of the website to greet new visitors. In order to show it you need to create a `index.md` file in the root of your website's folder and specify its layout as `layout: main`. The remaining customizations are specified in the `_config.yml` file.
|
@@ -377,6 +403,21 @@ conference:
|
|
377
403
|
demo: false
|
378
404
|
```
|
379
405
|
|
406
|
+
### Map
|
407
|
+
|
408
|
+
In order to help users finding your venue, an [OpenStreetMap](https://www.openstreetmap.org/) container displaying a map can be shown on any page. The map's initial position is globally defined and thus the same for all map containers. You can define the initial position of the map by setting the default zoom level `default_zoom`, the center coordinates `home_coord`, and the map provider for the tiles `map_provider`. Alternative map providers can be found [here](https://leaflet-extras.github.io/leaflet-providers/preview/).
|
409
|
+
The map contains small control buttons to zoom in and out, center the map back to the initial position, and show the visitors current location (has to be manually activated and granted by the visitor).
|
410
|
+
|
411
|
+
The map can be added to any page by setting `map: true` in its Front Matter or on the location main page by setting `conference.location.map: true` (see _Location Settings_ section below).
|
412
|
+
|
413
|
+
```yaml
|
414
|
+
conference:
|
415
|
+
map:
|
416
|
+
default_zoom: 17
|
417
|
+
home_coord: 47.37808, 8.53935
|
418
|
+
map_provider: "OpenStreetMap.Mapnik"
|
419
|
+
```
|
420
|
+
|
380
421
|
### Talk Settings
|
381
422
|
|
382
423
|
Each talk can have one or multiple categories associated via FrontMatter (see the _Individual Pages: Talks_ section below for more details). Some of these categories can be elevated to so called main categories". These are used to color group the talks across the entire website, particularly in the program. In order to do so add the `main_categories` property under the `talks` property. It consists of a list of all main categories. Each main category consists of:
|
@@ -429,8 +470,9 @@ In order to hide all rooms add the `hide: true` setting (default: `false`) to th
|
|
429
470
|
|
430
471
|
If your `location` overview file is not located under `/location` you can indicate an alternative path by setting the `url` property (default: `/location`) under the `location` property.
|
431
472
|
|
432
|
-
The
|
433
|
-
|
473
|
+
The location main page shows a navigation bar listing all the different rooms by name. Due to the quirks of Jekyll, the main page itself cannot be listed by title as defined in its Front Matter. Instead the title of the main landing page for the navigation bar is taken from the language files and defaults to "Directions". In order to change this, you can either change the language files directly (see the _Language_ section above), or you provide an alternative title by setting the `navbar_title` to the desired title under the `location` property.
|
474
|
+
|
475
|
+
The `location` layout can include a map to point to your venue by adding the `map: true` setting (default: `true`) to the `location` property. See the _Map_ section above for more information.
|
434
476
|
|
435
477
|
Example:
|
436
478
|
|
@@ -438,11 +480,9 @@ Example:
|
|
438
480
|
conference:
|
439
481
|
location:
|
440
482
|
hide: false
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
home_coord: 47.37808, 8.53935
|
445
|
-
map_provider: "OpenStreetMap.Mapnik"
|
483
|
+
url: '/location'
|
484
|
+
navbar_title: 'Location'
|
485
|
+
map: true
|
446
486
|
```
|
447
487
|
|
448
488
|
The map is based on the JavaScript Library [Leaflet](https://leafletjs.com/) and can be customized by editing the `assets/js/main.js` file, e.g. adding additional layers with markers, text, or shapes to the map. To start, copy simply the file from this repository and make use of the initialized global variable `window.conference.map` pointing to the Leaflet container.
|
@@ -514,7 +554,7 @@ The order of the rooms in the list defines the order of the rooms as shown in th
|
|
514
554
|
Each talk consists of
|
515
555
|
|
516
556
|
- a `name` (must correspond to one of the talk identifier),
|
517
|
-
- a starting time `time_start` given as `H:M` ([`strftime`](http://www.strfti.me) formated), and
|
557
|
+
- a starting time `time_start` given as `H:M` ([`strftime`](http://www.strfti.me) formated) or `H:M +∆` whereby ∆ is the day offset in relation to the date given for the given day, and
|
518
558
|
- an end time `time_end`.
|
519
559
|
|
520
560
|
The list of talks should (manually) be ordered by time, i.e. the first occurring talk should be listed first.
|
@@ -550,7 +590,8 @@ Each talk is represented by a file in the `_talks/` directory. It must begin wit
|
|
550
590
|
- the talk's `name` (used as identifier),
|
551
591
|
- one or more existing `speakers` name(s),
|
552
592
|
- optionally one or more `categories` of which one should be a main category as defined in the site's configuration,
|
553
|
-
- optionally a list of `links` (see the _Links_ subsection below for the available properties per link; links with icons are treated separately and are also included on the talk overview page),
|
593
|
+
- optionally a list of `links` (see the _Links_ subsection below for the available properties per link; links with icons are treated separately and are also included on the talk overview page),
|
594
|
+
- optionally a list of `live: links` (see the _Links_ subsection below for the available properties per link) which are shown below the live stream for the given talk in form of buttons, and
|
554
595
|
- optionally `hide: true` if the talk's page should not be linked to.
|
555
596
|
|
556
597
|
### Speakers
|
@@ -563,6 +604,8 @@ Each speaker is represented by a file in the `_speakers/` directory. It must beg
|
|
563
604
|
- optionally a list of `links` (see the _Links_ subsection below for the available properties per link; links with icons are treated separately), and
|
564
605
|
- optionally `hide: true` if the speaker's page should not be linked to.
|
565
606
|
|
607
|
+
If the speaker's name consists only out of one word, populate the `last_name` property and leave the `first_name` property empty. The last name is generally used for sorting the speakers.
|
608
|
+
|
566
609
|
### Rooms
|
567
610
|
|
568
611
|
Each room is represented by a file in the `_rooms/` directory. It must begin with valid [YAML Front Matter](https://jekyllrb.com/docs/frontmatter/) containing
|
@@ -602,6 +645,29 @@ Example:
|
|
602
645
|
video: https://media.ccc.de/
|
603
646
|
```
|
604
647
|
|
648
|
+
There exists a Python file in this repository, `_tools/import_resources.py`, which can be used to import resources such as slides and other documents from [pretalx.com](https://pretalx.com/p/about/)) via its API. It automatically downloads all files, stores them and updates the links of the talks concerned.
|
649
|
+
|
650
|
+
1. Copy the files `_tools/import_resources.py` and `_tools/requirements.txt` from this repository
|
651
|
+
|
652
|
+
2. Create a virtual environment and activate it
|
653
|
+
|
654
|
+
```bash
|
655
|
+
python -m venv venv
|
656
|
+
source venv/bin/activate
|
657
|
+
```
|
658
|
+
|
659
|
+
3. Install the requirements
|
660
|
+
|
661
|
+
```bash
|
662
|
+
pip install -r _tools/requirements.txt
|
663
|
+
```
|
664
|
+
|
665
|
+
4. Execute the script, e.g. to show the help type
|
666
|
+
|
667
|
+
```bash
|
668
|
+
python _tools/import_resources.py --help
|
669
|
+
```
|
670
|
+
|
605
671
|
|
606
672
|
## Overview Pages
|
607
673
|
|
@@ -621,7 +687,7 @@ If you choose a different location for the overview pages you must:
|
|
621
687
|
|
622
688
|
### Location / Room Overview
|
623
689
|
|
624
|
-
The `location` layout
|
690
|
+
The `location` layout can include a map container (if not disabled, see the _Location Settings_ section above) which can be customized (see the _Map_ section above).
|
625
691
|
|
626
692
|
### Live Stream Overview
|
627
693
|
|
@@ -631,6 +697,7 @@ The `stream-overview` layout contains all active streams on a single page (see t
|
|
631
697
|
|
632
698
|
Additional static pages can easily be added as files and linked to via navigation bar or main landing page (see above on how to).
|
633
699
|
|
700
|
+
Each of these pages can include a map at its end (e.g. to point to your venue) by adding the `map: true` setting to its Front Matter. See the _Map_ section above for more information.
|
634
701
|
|
635
702
|
## Design
|
636
703
|
|
@@ -653,6 +720,15 @@ Custom Bootstrap themes or simple color schemes such as designed with [Bootstrap
|
|
653
720
|
2. Add your Bootstrap variables in front of the `@import 'conference'` line, e.g. currently the primary color is set internally to green (instead of Bootstrap's default blue): `$primary: #074 !default;`
|
654
721
|
3. Add any additional CSS styles after it.
|
655
722
|
|
723
|
+
## Development
|
724
|
+
|
725
|
+
If you want to modify this theme and see its changes on an existing project, simply indicate in your `Gemfile` that you want to use the local copy of the theme by adding a `path` indication after the gem instantiation:
|
726
|
+
|
727
|
+
```ruby
|
728
|
+
group :jekyll_plugins do
|
729
|
+
gem "jekyll-theme-conference", path: "../[path to your local theme]"
|
730
|
+
end
|
731
|
+
```
|
656
732
|
|
657
733
|
## License
|
658
734
|
|
@@ -15,9 +15,9 @@ window.conference.live = (function() {
|
|
15
15
|
|
16
16
|
let data;
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
const confStart = {{ conf_start }};
|
19
|
+
const confEnd = {{ conf_end }};
|
20
|
+
const confDur = confEnd - confStart;
|
21
21
|
|
22
22
|
let freezeTime = false;
|
23
23
|
let timeFrozen = 0;
|
@@ -34,34 +34,34 @@ window.conference.live = (function() {
|
|
34
34
|
let streamVideoTimer;
|
35
35
|
let streamInfoTimer;
|
36
36
|
|
37
|
-
|
37
|
+
const loadData = function () {
|
38
38
|
// Fetch schedule from external file
|
39
39
|
$.getJSON('{{ site.baseurl }}/assets/js/data.json', function(json) {
|
40
40
|
data = json;
|
41
41
|
});
|
42
42
|
};
|
43
43
|
|
44
|
-
|
44
|
+
const getData = function () {
|
45
45
|
// Return data
|
46
46
|
return data;
|
47
47
|
};
|
48
48
|
|
49
|
-
|
49
|
+
const mod = function (n, m) {
|
50
50
|
// Absolute modulo
|
51
51
|
return ((n % m) + m) % m;
|
52
52
|
};
|
53
53
|
|
54
|
-
|
54
|
+
const timeNow = function () {
|
55
55
|
// Current timestamp in seconds
|
56
56
|
return Math.floor(Date.now() / 1000);
|
57
57
|
};
|
58
58
|
|
59
|
-
|
59
|
+
const timeCont = function () {
|
60
60
|
// Continuous time (respecting previous pauses)
|
61
61
|
return timeNow() - timeOffset;
|
62
62
|
};
|
63
63
|
|
64
|
-
|
64
|
+
const timeCycle = function () {
|
65
65
|
// Cyclic timestamp in seconds
|
66
66
|
let actTime = timeNow();
|
67
67
|
let relTime = mod(actTime, durDemo + 2*durPause) / (durDemo + 2*durPause);
|
@@ -69,7 +69,7 @@ window.conference.live = (function() {
|
|
69
69
|
return cycleTime;
|
70
70
|
};
|
71
71
|
|
72
|
-
|
72
|
+
const time = function () {
|
73
73
|
// Return app time
|
74
74
|
if (freezeTime) {
|
75
75
|
return timeFrozen;
|
@@ -82,7 +82,7 @@ window.conference.live = (function() {
|
|
82
82
|
}
|
83
83
|
};
|
84
84
|
|
85
|
-
|
85
|
+
const pauseTime = function () {
|
86
86
|
// Pause app time
|
87
87
|
if (!freezeTime) {
|
88
88
|
timeFrozen = time();
|
@@ -92,7 +92,7 @@ window.conference.live = (function() {
|
|
92
92
|
}
|
93
93
|
};
|
94
94
|
|
95
|
-
|
95
|
+
const continueTime = function () {
|
96
96
|
// Continue app time
|
97
97
|
if (freezeTime) {
|
98
98
|
freezeTime = false;
|
@@ -101,7 +101,7 @@ window.conference.live = (function() {
|
|
101
101
|
}
|
102
102
|
};
|
103
103
|
|
104
|
-
|
104
|
+
const resetTime = function () {
|
105
105
|
// Reset app time
|
106
106
|
timeOffset = 0;
|
107
107
|
freezeTime = false;
|
@@ -109,7 +109,7 @@ window.conference.live = (function() {
|
|
109
109
|
startUpdate();
|
110
110
|
};
|
111
111
|
|
112
|
-
|
112
|
+
const setTime = function (newTime, newDay) {
|
113
113
|
// Set and pause app time
|
114
114
|
pauseTime();
|
115
115
|
|
@@ -137,7 +137,7 @@ window.conference.live = (function() {
|
|
137
137
|
update();
|
138
138
|
};
|
139
139
|
|
140
|
-
|
140
|
+
const getTime = function () {
|
141
141
|
// Return app time as string
|
142
142
|
let tConvert = time();
|
143
143
|
|
@@ -149,7 +149,7 @@ window.conference.live = (function() {
|
|
149
149
|
return dStr +" "+ h +":"+ (m < 10 ? "0" : "") + m;
|
150
150
|
};
|
151
151
|
|
152
|
-
|
152
|
+
const timeUnit = function () {
|
153
153
|
// App time refresh rate
|
154
154
|
if (demo) {
|
155
155
|
return 0.1;
|
@@ -159,7 +159,7 @@ window.conference.live = (function() {
|
|
159
159
|
}
|
160
160
|
};
|
161
161
|
|
162
|
-
|
162
|
+
const delayStart = function (startTime) {
|
163
163
|
// Seconds until given startTime occurs
|
164
164
|
let tNow = time();
|
165
165
|
let tUnit = timeUnit();
|
@@ -179,18 +179,17 @@ window.conference.live = (function() {
|
|
179
179
|
}
|
180
180
|
};
|
181
181
|
|
182
|
-
let
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
return demo;
|
182
|
+
let model = {
|
183
|
+
set demo(value) {
|
184
|
+
demo = value;
|
185
|
+
resetTime();
|
186
|
+
},
|
187
|
+
get demo() {
|
188
|
+
return demo;
|
189
|
+
}
|
191
190
|
};
|
192
191
|
|
193
|
-
|
192
|
+
const updateLive = function () {
|
194
193
|
// Update status all live elements in DOM
|
195
194
|
let tNow = time();
|
196
195
|
let liveShow = document.getElementsByClassName('live-show');
|
@@ -322,7 +321,7 @@ window.conference.live = (function() {
|
|
322
321
|
}
|
323
322
|
};
|
324
323
|
|
325
|
-
|
324
|
+
const startUpdateLive = function () {
|
326
325
|
// Start update timer to update live elements in DOM
|
327
326
|
stopUpdateLive();
|
328
327
|
updateLive();
|
@@ -339,7 +338,7 @@ window.conference.live = (function() {
|
|
339
338
|
}
|
340
339
|
};
|
341
340
|
|
342
|
-
|
341
|
+
const stopUpdateLive = function () {
|
343
342
|
// stopUpdate update timer to update live elements in DOM
|
344
343
|
if (typeof liveTimer !== "undefined") {
|
345
344
|
clearInterval(liveTimer);
|
@@ -347,13 +346,13 @@ window.conference.live = (function() {
|
|
347
346
|
};
|
348
347
|
|
349
348
|
{% if site.conference.live.streaming -%}
|
350
|
-
|
351
|
-
|
352
|
-
|
349
|
+
const streamPause = {{ site.conference.live.streaming.time_pause | default: 60 }}; // in minutes
|
350
|
+
const streamPrepend = {{ site.conference.live.streaming.time_prepend | default: 5 }}; // in minutes
|
351
|
+
const streamExtend = {{ site.conference.live.streaming.time_extend | default: 5 }}; // in minutes
|
353
352
|
|
354
353
|
let streamModal;
|
355
354
|
|
356
|
-
|
355
|
+
const getRoom = function (roomName) {
|
357
356
|
// Return room object for given room name
|
358
357
|
if (roomName in data.rooms) {
|
359
358
|
return data.rooms[roomName];
|
@@ -363,7 +362,7 @@ window.conference.live = (function() {
|
|
363
362
|
}
|
364
363
|
};
|
365
364
|
|
366
|
-
|
365
|
+
const getTalks = function (roomName) {
|
367
366
|
if (roomName in data.talks) {
|
368
367
|
return data.talks[roomName];
|
369
368
|
}
|
@@ -372,7 +371,7 @@ window.conference.live = (function() {
|
|
372
371
|
}
|
373
372
|
};
|
374
373
|
|
375
|
-
|
374
|
+
const getNextTalk = function (roomName) {
|
376
375
|
// Get talk object for next talk in given room
|
377
376
|
let timeNow = time();
|
378
377
|
let talksHere = getTalks(roomName);
|
@@ -389,7 +388,7 @@ window.conference.live = (function() {
|
|
389
388
|
return false;
|
390
389
|
};
|
391
390
|
|
392
|
-
|
391
|
+
const getNextPause = function (roomName) {
|
393
392
|
// Get time object for next pause in given room
|
394
393
|
let timeNow = time();
|
395
394
|
let talksHere = getTalks(roomName);
|
@@ -409,7 +408,7 @@ window.conference.live = (function() {
|
|
409
408
|
return false;
|
410
409
|
};
|
411
410
|
|
412
|
-
|
411
|
+
const setStreamIframeContent = function (content) {
|
413
412
|
// Set stream modal iframe to show given text
|
414
413
|
streamModal.find('iframe').attr('src', '');
|
415
414
|
streamModal.find('iframe').addClass('d-none');
|
@@ -417,14 +416,14 @@ window.conference.live = (function() {
|
|
417
416
|
streamModal.find('#stream-placeholder').addClass('d-flex');
|
418
417
|
};
|
419
418
|
|
420
|
-
|
419
|
+
const setStreamIframeSrc = function (href) {
|
421
420
|
// Set stream modal iframe to show given URL
|
422
421
|
streamModal.find('iframe').attr('src', href);
|
423
422
|
streamModal.find('#stream-placeholder').addClass('d-none').removeClass('d-flex');
|
424
423
|
streamModal.find('iframe').removeClass('d-none');
|
425
424
|
};
|
426
425
|
|
427
|
-
|
426
|
+
const setStreamVideo = function (roomName) {
|
428
427
|
// Update stream modal iframe:
|
429
428
|
// Show stream with start/pause/end message (for given room) and keep updated
|
430
429
|
let timeNow = time();
|
@@ -504,7 +503,7 @@ window.conference.live = (function() {
|
|
504
503
|
}
|
505
504
|
};
|
506
505
|
|
507
|
-
|
506
|
+
const setStreamInfo = function (roomName) {
|
508
507
|
// Update stream modal info bar:
|
509
508
|
// Show next talk and speaker (for given room) and keep updated
|
510
509
|
let timeNow = time();
|
@@ -527,7 +526,7 @@ window.conference.live = (function() {
|
|
527
526
|
streamModal.find('#stream-info-talk').text(talkNext.name).attr('href', talkNext.href);
|
528
527
|
|
529
528
|
let speakerStr = '';
|
530
|
-
for (
|
529
|
+
for (let i = 0; i < talkNext.speakers.length; i++) {
|
531
530
|
let speaker = data.speakers[talkNext.speakers[i]];
|
532
531
|
if (speaker.href == '') {
|
533
532
|
speakerStr += speaker.name +', '
|
@@ -539,6 +538,27 @@ window.conference.live = (function() {
|
|
539
538
|
speakerStr = speakerStr.slice(0, -2);
|
540
539
|
streamModal.find('#stream-info-speakers').html(speakerStr);
|
541
540
|
|
541
|
+
if (talkNext.live_links) {
|
542
|
+
let linksStr = '';
|
543
|
+
for (let i = 0; i < talkNext.live_links.length; i++) {
|
544
|
+
const link = talkNext.live_links[i];
|
545
|
+
|
546
|
+
linksStr += '<a href="' + link.href + '" class="btn btn-light m-1'
|
547
|
+
if (link.disabled) {
|
548
|
+
linksStr += ' disabled';
|
549
|
+
}
|
550
|
+
linksStr += '">';
|
551
|
+
if (link.icon) {
|
552
|
+
linksStr += '<i class="fas fa-' + link.icon + '"></i> ';
|
553
|
+
}
|
554
|
+
linksStr += link.name + '</a>';
|
555
|
+
}
|
556
|
+
streamModal.find('#stream-info-links').html(linksStr).removeClass('d-none');
|
557
|
+
}
|
558
|
+
else {
|
559
|
+
streamModal.find('#stream-info-links').addClass('d-none');
|
560
|
+
}
|
561
|
+
|
542
562
|
streamModal.find('#stream-info').removeClass('d-none');
|
543
563
|
|
544
564
|
if (!freezeTime) {
|
@@ -562,7 +582,7 @@ window.conference.live = (function() {
|
|
562
582
|
}
|
563
583
|
};
|
564
584
|
|
565
|
-
|
585
|
+
const setStream = function (roomName) {
|
566
586
|
// Update stream modal (iframe and info bar) for given room
|
567
587
|
streamModal.find('.modal-footer .btn').removeClass('active');
|
568
588
|
streamModal.find('#stream-select').val(0);
|
@@ -578,7 +598,7 @@ window.conference.live = (function() {
|
|
578
598
|
streamModal.find('#stream-select').val(room.id);
|
579
599
|
};
|
580
600
|
|
581
|
-
|
601
|
+
const updateStream = function () {
|
582
602
|
// Update stream modal for currently active room button
|
583
603
|
if (streamModal.hasClass('show')) {
|
584
604
|
let activeButton = streamModal.find('.modal-footer .btn.active');
|
@@ -590,7 +610,7 @@ window.conference.live = (function() {
|
|
590
610
|
}
|
591
611
|
};
|
592
612
|
|
593
|
-
|
613
|
+
const stopUpdateStream = function () {
|
594
614
|
// Stop stream modal update timer
|
595
615
|
if (typeof streamVideoTimer !== "undefined") {
|
596
616
|
clearInterval(streamVideoTimer);
|
@@ -600,14 +620,14 @@ window.conference.live = (function() {
|
|
600
620
|
}
|
601
621
|
};
|
602
622
|
|
603
|
-
|
623
|
+
const hideModal = function () {
|
604
624
|
// Close stream modal
|
605
625
|
streamModal.find('iframe').attr('src', '');
|
606
626
|
streamModal.find('.modal-footer .btn').removeClass('active');
|
607
627
|
streamModal.find('#stream-select').selectedIndex = -1;
|
608
628
|
};
|
609
629
|
|
610
|
-
|
630
|
+
const setupStream = function () {
|
611
631
|
// Setup events when modal opens/closes
|
612
632
|
streamModal = $('#stream-modal');
|
613
633
|
|
@@ -638,43 +658,43 @@ window.conference.live = (function() {
|
|
638
658
|
});
|
639
659
|
};
|
640
660
|
|
641
|
-
|
661
|
+
const setup = function () {
|
642
662
|
loadData();
|
643
663
|
startUpdateLive();
|
644
664
|
setupStream();
|
645
665
|
};
|
646
666
|
|
647
|
-
|
667
|
+
const update = function () {
|
648
668
|
updateLive();
|
649
669
|
updateStream();
|
650
670
|
};
|
651
671
|
|
652
|
-
|
672
|
+
const startUpdate = function () {
|
653
673
|
startUpdateLive();
|
654
674
|
updateStream();
|
655
675
|
};
|
656
676
|
|
657
|
-
|
677
|
+
const stopUpdate = function () {
|
658
678
|
stopUpdateLive();
|
659
679
|
stopUpdateStream();
|
660
680
|
};
|
661
681
|
|
662
682
|
{%- else -%}
|
663
683
|
|
664
|
-
|
684
|
+
const setup = function () {
|
665
685
|
loadData();
|
666
686
|
startUpdateLive();
|
667
687
|
};
|
668
688
|
|
669
|
-
|
689
|
+
const update = function () {
|
670
690
|
updateLive();
|
671
691
|
};
|
672
692
|
|
673
|
-
|
693
|
+
const startUpdate = function () {
|
674
694
|
startUpdateLive();
|
675
695
|
};
|
676
696
|
|
677
|
-
|
697
|
+
const stopUpdate = function () {
|
678
698
|
stopUpdateLive();
|
679
699
|
};
|
680
700
|
|
@@ -690,8 +710,7 @@ window.conference.live = (function() {
|
|
690
710
|
setTime: setTime,
|
691
711
|
getTime: getTime,
|
692
712
|
|
693
|
-
|
694
|
-
demo: demoOn,
|
713
|
+
demo: model.demo,
|
695
714
|
durDemo: durDemo,
|
696
715
|
durPause: durPause
|
697
716
|
};
|
@@ -2,9 +2,9 @@ window.conference.mapConfig = (function() {
|
|
2
2
|
|
3
3
|
let map;
|
4
4
|
|
5
|
-
let mapProvider = "{{ site.conference.
|
6
|
-
let homeCoord = [{{ site.conference.
|
7
|
-
let zoomLevel = {{ site.conference.
|
5
|
+
let mapProvider = "{{ site.conference.map.map_provider | default: 'OpenStreetMap.Mapnik' }}";
|
6
|
+
let homeCoord = [{{ site.conference.map.home_coord }}];
|
7
|
+
let zoomLevel = {{ site.conference.map.default_zoom | default: 17 }};
|
8
8
|
|
9
9
|
let setup = function (elId) {
|
10
10
|
map = L.map(elId).setView(homeCoord, zoomLevel);
|
data/_includes/js/conference.js
CHANGED
@@ -13,7 +13,8 @@ window.conference = {};
|
|
13
13
|
{% include js/conference-program.js %}
|
14
14
|
|
15
15
|
// Leaflet (Map Display)
|
16
|
-
{%
|
16
|
+
{% include partials/get_enable_map.html %}
|
17
|
+
{% if enable_map %}
|
17
18
|
{% include js/leaflet.js %}
|
18
19
|
{% include js/leaflet-easybutton.js %}
|
19
20
|
{% include js/leaflet-locatecontrol.js %}
|
@@ -4,7 +4,7 @@
|
|
4
4
|
{%- unless site.conference.lang == "en" -%}
|
5
5
|
{%- assign errors = errors | push : "The internationalization file containing different strings for this template seems to be missing. Have you copied the `_data/lang.yml` file from the [theme's repository](https://github.com/DigitaleGesellschaft/jekyll-theme-conference/blob/master/_data/lang.yml) to you local website folder?" -%}
|
6
6
|
{%- endunless -%}
|
7
|
-
{%- elsif site.data.lang.version !=
|
7
|
+
{%- elsif site.data.lang.version != 7 -%}
|
8
8
|
{%- assign errors = errors | push : "The internationalization file in `_data/lang.yml` seems to be outdated and does not correspond to the current version of the theme. Grab the current version from the [theme's repository](https://github.com/DigitaleGesellschaft/jekyll-theme-conference/blob/master/_data/lang.yml)." -%}
|
9
9
|
{%- endunless -%}
|
10
10
|
{%- unless site.conference.lang == "en" or site.conference.lang == "de" or site.conference.lang == "fr" or site.conference.lang == "pt" -%}
|
@@ -2,8 +2,9 @@
|
|
2
2
|
{%- assign t = r.talks | first -%}
|
3
3
|
{%- include partials/get_talk_time.html -%}
|
4
4
|
|
5
|
-
{%- if forloop.index == 1 or talk_start_hour < day_start_hour or talk_start_hour == day_start_hour and talk_start_min < day_start_min-%}
|
5
|
+
{%- if forloop.index == 1 or talk_start_day < day_start_day or talk_start_day == day_start_day and talk_start_hour < day_start_hour or talk_start_hour == day_start_hour and talk_start_min < day_start_min-%}
|
6
6
|
{%- assign day_start_talk = t -%}
|
7
|
+
{%- assign day_start_day = talk_start_day -%}
|
7
8
|
{%- assign day_start_hour = talk_start_hour -%}
|
8
9
|
{%- assign day_start_min = talk_start_min -%}
|
9
10
|
{%- endif -%}
|
@@ -11,8 +12,9 @@
|
|
11
12
|
{%- assign t = r.talks | last -%}
|
12
13
|
{%- include partials/get_talk_time.html -%}
|
13
14
|
|
14
|
-
{%- if forloop.index == 1 or talk_end_hour > day_end_hour or talk_end_hour == day_end_hour and talk_end_min > day_end_min-%}
|
15
|
+
{%- if forloop.index == 1 or talk_end_day > day_end_day or talk_end_day == day_end_day and talk_end_hour > day_end_hour or talk_end_hour == day_end_hour and talk_end_min > day_end_min-%}
|
15
16
|
{%- assign day_end_talk = t -%}
|
17
|
+
{%- assign day_end_day = talk_end_day -%}
|
16
18
|
{%- assign day_end_hour = talk_end_hour -%}
|
17
19
|
{%- assign day_end_min = talk_end_min -%}
|
18
20
|
{%- endif -%}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
{%- if site.conference.location.map -%}
|
2
|
+
{%- assign enable_map = true -%}
|
3
|
+
{%- else -%}
|
4
|
+
{%- assign enable_map = false -%}
|
5
|
+
{%- for page in site.pages -%}
|
6
|
+
{%- if page.map -%}
|
7
|
+
{%- assign enable_map = true -%}
|
8
|
+
{%- break -%}
|
9
|
+
{%- endif -%}
|
10
|
+
{%- endfor -%}
|
11
|
+
{%- endif -%}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
{%- unless site.preposition == empty -%}
|
2
|
+
{%- assign preposition = site.preposition -%}
|
3
|
+
{%- else -%}
|
4
|
+
{%- assign preposition = '-' -%}
|
5
|
+
{%- endunless -%}
|
6
|
+
|
7
|
+
{%- capture page_description -%}
|
8
|
+
{%- if page.layout == 'talk' -%}
|
9
|
+
{{ site.data.lang[site.conference.lang].talk.title | default: 'Talk' }} {{ site.data.lang[site.conference.lang].pronoun.by | default: 'by'}} {% include partials/list_speakers.html text_only=true %} {{ preposition }} {{ site.title }}
|
10
|
+
{%- elsif page.layout == 'speaker' -%}
|
11
|
+
{{ site.data.lang[site.conference.lang].speaker.title | default: 'Speaker' }} {{ preposition }} {{ site.title }}
|
12
|
+
{%- elsif site.description -%}
|
13
|
+
{{ site.description }}
|
14
|
+
{%- endif -%}
|
15
|
+
{%- endcapture -%}
|
16
|
+
|
17
|
+
{%- if page_description.empty and include.default -%}
|
18
|
+
{%- assign page_description = include.default -%}
|
19
|
+
{%- endif -%}
|
20
|
+
|
21
|
+
{%- if include.replace_quotes -%}
|
22
|
+
{%- assign page_description = page_description | replace: '"', "'" -%}
|
23
|
+
{%- endif -%}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
{%- capture page_title -%}
|
2
|
+
{%- if page.layout == 'room' -%}
|
3
|
+
{{- page.name -}}
|
4
|
+
{%- elsif page.layout == 'speaker' -%}
|
5
|
+
{{- page.first_name }} {{ page.last_name -}}
|
6
|
+
{%- elsif page.layout == 'talk' -%}
|
7
|
+
{{- page.name -}}
|
8
|
+
|
9
|
+
{%- elsif page.title -%}
|
10
|
+
{{- page.title -}}
|
11
|
+
|
12
|
+
{%- else -%}
|
13
|
+
{%- if page.layout == 'location' -%}
|
14
|
+
{{- site.data.lang[site.conference.lang].location.title | default: "Location" -}}
|
15
|
+
{%- elsif page.layout == 'program' -%}
|
16
|
+
{{- site.data.lang[site.conference.lang].program.title | default: "Program" -}}
|
17
|
+
{%- elsif page.layout == 'speaker-overview' -%}
|
18
|
+
{{- site.data.lang[site.conference.lang].speaker.overview | default: "Speakers" -}}
|
19
|
+
{%- elsif page.layout == 'stream-overview' -%}
|
20
|
+
{{ site.data.lang[site.conference.lang].live.stream | default: "Live Streams" }}
|
21
|
+
{%- elsif page.layout == 'talk-overview' -%}
|
22
|
+
{{- site.data.lang[site.conference.lang].talk.overview | default: "Talks" -}}
|
23
|
+
{%- endif -%}
|
24
|
+
{%- endif -%}
|
25
|
+
{%- endcapture -%}
|
26
|
+
|
27
|
+
{%- if page_title == empty and include.default -%}
|
28
|
+
{%- assign page_title = include.default -%}
|
29
|
+
{%- endif -%}
|
30
|
+
|
31
|
+
{%- if include.replace_quotes -%}
|
32
|
+
{%- assign page_title = page_title | replace: '"', "'" -%}
|
33
|
+
{%- endif -%}
|
@@ -1,9 +1,24 @@
|
|
1
1
|
{%- assign talk_start = t.time_start -%}
|
2
2
|
{%- assign talk_end = t.time_end -%}
|
3
3
|
|
4
|
-
{%-
|
4
|
+
{%- if talk_start contains ' +' -%}
|
5
|
+
{%- assign talk_start_day = talk_start | split: ' +' | last | plus: 0 -%}
|
6
|
+
{%- assign talk_start = talk_start | split: ' +' | first -%}
|
7
|
+
{%- else -%}
|
8
|
+
{%- assign talk_start_day = 0 -%}
|
9
|
+
{%- endif -%}
|
10
|
+
{%- if talk_end contains ' +' -%}
|
11
|
+
{%- assign talk_end_day = talk_end | split: ' +' | last | plus: 0 -%}
|
12
|
+
{%- assign talk_end = talk_end | split: ' +' | first -%}
|
13
|
+
{%- else -%}
|
14
|
+
{%- assign talk_end_day = 0 -%}
|
15
|
+
{%- endif -%}
|
16
|
+
|
17
|
+
{%- assign talk_start_hour = talk_start | split: ':' | first | plus: 0 -%}
|
5
18
|
{%- assign talk_start_min = talk_start | split: ':' | last | divided_by: site.conference.program.time_steps | floor | times: site.conference.program.time_steps -%}
|
6
|
-
{%- assign talk_end_hour = talk_end | split: ':' | first -%}
|
19
|
+
{%- assign talk_end_hour = talk_end | split: ':' | first | plus: 0 -%}
|
7
20
|
{%- assign talk_end_min = talk_end | split: ':' | last | divided_by: site.conference.program.time_steps | ceil | times: site.conference.program.time_steps -%}
|
8
21
|
|
9
|
-
{%- assign
|
22
|
+
{%- assign talk_start_hour_24h = talk_start_day | times: 24 | plus: talk_start_hour -%}
|
23
|
+
{%- assign talk_end_hour_24h = talk_end_day | times: 24 | plus: talk_end_hour -%}
|
24
|
+
{%- assign talk_duration_min = talk_end_hour_24h | minus: talk_start_hour_24h | times: 60 | minus: talk_start_min | plus: talk_end_min -%}
|
@@ -1,4 +1,9 @@
|
|
1
|
-
{%-
|
2
|
-
|
3
|
-
{%- assign
|
4
|
-
{%- assign
|
1
|
+
{%- include partials/get_talk_time.html -%}
|
2
|
+
|
3
|
+
{%- assign datetime_start = d.date | append: " " | append: talk_start -%}
|
4
|
+
{%- assign add_days_start = talk_start_day | times: 24 | times: 60 | times: 60 -%}
|
5
|
+
{%- assign timestamp_start = datetime_start | date: "%s" | plus: add_days_start | date: "%s" -%}
|
6
|
+
|
7
|
+
{%- assign datetime_end = d.date | append: " " | append: talk_end -%}
|
8
|
+
{%- assign add_days_end = talk_end_day | times: 24 | times: 60 | times: 60 -%}
|
9
|
+
{%- assign timestamp_end = datetime_end | date: "%s" | plus: add_days_end | date: "%s" -%}
|
@@ -5,16 +5,19 @@
|
|
5
5
|
<meta charset="utf-8" />
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
7
7
|
|
8
|
+
{% include partials/get_page_title.html -%}
|
8
9
|
<title>
|
9
|
-
{
|
10
|
+
{{- page_title -}}
|
11
|
+
{%- unless page_title == empty %} - {% endunless -%}
|
12
|
+
{{- site.title -}}
|
10
13
|
</title>
|
11
|
-
|
14
|
+
{% include partials/list_page_meta.html %}
|
12
15
|
|
13
16
|
<link rel="stylesheet" href="{{ site.baseurl }}/assets/css/main.css?t={{ site.time | date: "%s" }}" />
|
14
17
|
|
15
18
|
<link rel="preload" as="font" href="{{ site.baseurl }}/assets/webfonts/fa-regular-400.woff2" type="font/woff2" crossorigin="anonymous" />
|
16
19
|
<link rel="preload" as="font" href="{{ site.baseurl }}/assets/webfonts/fa-solid-900.woff2" type="font/woff2" crossorigin="anonymous" />
|
17
|
-
{
|
20
|
+
{%- if site.conference.live %}
|
18
21
|
<link rel="prefetch" as="image" href="{{ site.baseurl }}/assets/icons/live.svg" type="image/svg+xml" crossorigin="anonymous" />
|
19
22
|
<link rel="prefetch" as="fetch" href="{{ site.baseurl }}/assets/js/data.json" type="application/json" crossorigin="anonymous" />
|
20
23
|
{%- endif %}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
{% unless site.conference.link_preview.disable -%}
|
2
|
+
{%- include partials/get_page_title.html default=site.title replace_quotes=true -%}
|
3
|
+
{%- include partials/get_page_description.html default=site.title replace_quotes=true -%}
|
4
|
+
|
5
|
+
<meta name="description" content="{{ page_description }}" />
|
6
|
+
|
7
|
+
<meta name="twitter:card" content="summary" />
|
8
|
+
{%- if site.conference.link_preview.img and site.conference.link_preview.img.twitter %}
|
9
|
+
<meta name="twitter:image" content="{{ site.conference.link_preview.img.twitter | prepend: '/assets/images/' | prepend: site.baseurl | prepend: site.url }}" />
|
10
|
+
{%- endif %}
|
11
|
+
<meta name="twitter:title" content="{{ page_title }}" />
|
12
|
+
<meta name="twitter:description" content="{{ page_description }}" />
|
13
|
+
|
14
|
+
<meta property="og:site_name" content="{{ site.title }}" />
|
15
|
+
{%- if site.conference.link_preview.img and site.conference.link_preview.img.open_graph %}
|
16
|
+
<meta property="og:image" content="{{ site.conference.link_preview.img.open_graph | prepend: '/assets/images/' | prepend: site.baseurl | prepend: site.url }}" />
|
17
|
+
{%- endif %}
|
18
|
+
<meta property="og:url" content="{{ page.url | prepend: site.baseurl | prepend: site.url }}" />
|
19
|
+
<meta property="og:title" content="{{ page_title }}" />
|
20
|
+
<meta property="og:description" content="{{ page_description }}" />
|
21
|
+
<meta property="og:type" content="website" />
|
22
|
+
|
23
|
+
{%- endunless %}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
{
|
1
|
+
{% for speaker_name in talk.speakers -%}
|
2
2
|
{%- assign speaker = site.speakers | where: 'name', speaker_name | first -%}
|
3
3
|
{%- if site.conference.speakers.show_firstname -%}
|
4
4
|
{%- assign speaker_short = speaker.first_name | append: ' ' | append: speaker.last_name -%}
|
@@ -6,11 +6,17 @@
|
|
6
6
|
{%- assign speaker_short = speaker.first_name | slice: 0 | append : '. ' | append: speaker.last_name -%}
|
7
7
|
{%- endif -%}
|
8
8
|
|
9
|
-
{%- if speaker.hide -%}
|
10
|
-
{{ speaker_short }}
|
9
|
+
{%- if speaker.hide or include.text_only -%}
|
10
|
+
{{- speaker_short -}}
|
11
11
|
{%- else -%}
|
12
|
-
<a class="text-reset" href="{{ speaker.url | prepend: site.baseurl }}">
|
12
|
+
<a class="text-reset" href="{{ speaker.url | prepend: site.baseurl }}">
|
13
|
+
{{- speaker_short -}}
|
14
|
+
</a>
|
13
15
|
{%- endif -%}
|
14
|
-
|
16
|
+
|
17
|
+
{%- unless forloop.last %}
|
18
|
+
{%- assign forloop_index_before_last = talk.speakers.size | minus: 1 -%}
|
19
|
+
{% if forloop.index == forloop_index_before_last and include.text_only %} {{ site.data.lang[site.conference.lang].pronoun.and | default: 'and' }} {% else %}, {% endif -%}
|
20
|
+
{%- endunless -%}
|
15
21
|
|
16
22
|
{%- endfor -%}
|
@@ -26,17 +26,18 @@
|
|
26
26
|
</p>
|
27
27
|
<p class="font-weight-light mb-0" id="stream-info-speakers"></p>
|
28
28
|
</div>
|
29
|
+
<div class="align-self-center m-0 mt-1" id="stream-info-links"></div>
|
29
30
|
</div>
|
30
31
|
|
31
32
|
<div class="modal-footer justify-content-around">
|
32
|
-
{
|
33
|
+
{% for room in site.rooms -%}
|
33
34
|
<a id="stream-button{{ forloop.index }}" href="#" class="btn btn-outline-primary d-none d-sm-inline {% unless room.live %}disabled{% endunless %}" role="button" data-room="{{ room.name }}">
|
34
35
|
{{ room.name }}
|
35
36
|
</a>
|
36
37
|
{%- endfor %}
|
37
38
|
<div class="form-group w-100 d-block d-sm-none">
|
38
39
|
<select class="form-control" id="stream-select">
|
39
|
-
{
|
40
|
+
{% for room in site.rooms -%}
|
40
41
|
<option value="{{ forloop.index }}" {% unless room.live %}disabled{% endunless %}>{{ room.name }}</option>
|
41
42
|
{%- endfor %}
|
42
43
|
</select>
|
@@ -1,7 +1,11 @@
|
|
1
1
|
<ul class="nav nav-pills d-print-none mb-3">
|
2
2
|
<li class="nav-item">
|
3
3
|
<a class="nav-link {% if page.name contains 'index' %}active{% endif %}" href="{{ site.conference.location.url | prepend: site.baseurl }}">
|
4
|
-
{
|
4
|
+
{% if site.conference.location.navbar_title -%}
|
5
|
+
{{- site.conference.location.navbar_title -}}
|
6
|
+
{%- else -%}
|
7
|
+
{{- site.data.lang[site.conference.lang].location.directions | default: "Directions" -}}
|
8
|
+
{%- endif %}
|
5
9
|
</a>
|
6
10
|
</li>
|
7
11
|
{%- for room in site.rooms -%}
|
data/_layouts/data.html
CHANGED
@@ -88,6 +88,23 @@
|
|
88
88
|
{%- include partials/get_talk_timestamp.html %}
|
89
89
|
"start": {{ timestamp_start }},
|
90
90
|
"end": {{ timestamp_end }}
|
91
|
+
|
92
|
+
{%- if talk.live.links -%},
|
93
|
+
"live_links": [
|
94
|
+
{%- for link in talk.live.links %}
|
95
|
+
{
|
96
|
+
"name": "{{ link.name | replace: '"', '\"' }}",
|
97
|
+
"href": "{{ link.absolute_url | replace: '"', '%22' }}"
|
98
|
+
{%- if link.icon -%},
|
99
|
+
"icon": "{{ link.icon | replace: '"', '\"' }}"
|
100
|
+
{%- endif %}
|
101
|
+
{%- if link.disabled -%},
|
102
|
+
"disabled": true
|
103
|
+
{%- endif %}
|
104
|
+
}{%- unless forloop.last -%},{%- endunless -%}
|
105
|
+
{%- endfor %}
|
106
|
+
]
|
107
|
+
{%- endif %}
|
91
108
|
}{%- unless forloop.last -%},{%- endunless -%}
|
92
109
|
{%- endfor -%}
|
93
110
|
{%- endif -%}
|
data/_layouts/location.html
CHANGED
data/_layouts/page.html
CHANGED
data/_layouts/program.html
CHANGED
@@ -61,6 +61,10 @@
|
|
61
61
|
<tbody>
|
62
62
|
{%- include partials/get_day_time.html -%}
|
63
63
|
|
64
|
+
{%- if day_end_day > day_start_day -%}
|
65
|
+
{%- assign day_end_hour = day_end_day | minus: day_start_day | times: 24 | plus: day_end_hour -%}
|
66
|
+
{%- endif -%}
|
67
|
+
|
64
68
|
{%- assign day_duration_min = day_end_hour | minus: day_start_hour | times: 60 | minus: day_start_min | plus: day_end_min -%}
|
65
69
|
{%- assign nbr_steps = day_duration_min | divided_by: site.conference.program.time_steps -%}
|
66
70
|
|
@@ -74,7 +78,12 @@
|
|
74
78
|
{%- assign z-index-max = 999 -%}
|
75
79
|
|
76
80
|
{%- for i in (1..nbr_steps) -%}
|
77
|
-
{%- assign
|
81
|
+
{%- assign current_day = 0 -%}
|
82
|
+
{%- assign current_hour = i | minus: 1 | times: site.conference.program.time_steps | plus: day_start_min | divided_by: 60 | floor | plus: day_start_hour -%}
|
83
|
+
{%- if current_hour >= 24 -%}
|
84
|
+
{%- assign current_day = current_hour | divided_by: 24 | floor -%}
|
85
|
+
{%- assign current_hour = current_hour | modulo: 24 -%}
|
86
|
+
{%- endif -%}
|
78
87
|
{%- assign current_min = i | minus: 1 | times: site.conference.program.time_steps | plus: day_start_min | modulo: 60 -%}
|
79
88
|
{%- if current_min < 10 -%}
|
80
89
|
{%- assign current_time = current_hour | append: ':0' | append: current_min -%}
|
@@ -106,9 +115,9 @@
|
|
106
115
|
|
107
116
|
{%- include partials/get_talk_time.html -%}
|
108
117
|
|
109
|
-
{%- assign d_start_hour = current_hour | minus: talk_start_hour -%}
|
118
|
+
{%- assign d_start_hour = current_day | minus: talk_start_day | times: 24 | plus: current_hour | minus: talk_start_hour -%}
|
110
119
|
{%- assign d_start_min = current_min | minus: talk_start_min -%}
|
111
|
-
{%- assign d_end_hour = current_hour | minus: talk_end_hour -%}
|
120
|
+
{%- assign d_end_hour = current_day | minus: talk_end_day | times: 24 | plus: current_hour | minus: talk_end_hour -%}
|
112
121
|
{%- assign d_end_min = current_min | minus: talk_end_min -%}
|
113
122
|
|
114
123
|
{%- assign has_started = false -%}
|
@@ -127,7 +136,7 @@
|
|
127
136
|
{%- assign has_ended = true -%}
|
128
137
|
{%- endif -%}
|
129
138
|
|
130
|
-
{%- if has_started and has_ended == false -%}
|
139
|
+
{%- if has_started == true and has_ended == false -%}
|
131
140
|
{%- assign active_talk = true -%}
|
132
141
|
{%- endif -%}
|
133
142
|
|
@@ -156,7 +165,7 @@
|
|
156
165
|
|
157
166
|
{%- endfor %}
|
158
167
|
|
159
|
-
{%- unless active_talk %}
|
168
|
+
{%- unless active_talk == true %}
|
160
169
|
<td class="p-0"></td>
|
161
170
|
{%- endunless -%}
|
162
171
|
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<div class="row">
|
19
19
|
{%- endif %}
|
20
20
|
|
21
|
-
<div class="col-md">
|
21
|
+
<div class="col-md mb-4">
|
22
22
|
<h3>{{ room.name }}</h3>
|
23
23
|
<div class="embed-responsive embed-responsive-16by9">
|
24
24
|
<iframe class="embed-responsive-item" src="{{ room.live }}" allowfullscreen></iframe>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-theme-conference
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1
|
4
|
+
version: 3.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lorenz Schmid
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 2.
|
33
|
+
version: 2.2.32
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 2.
|
40
|
+
version: 2.2.32
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,16 +78,20 @@ files:
|
|
78
78
|
- _includes/partials/footer.html
|
79
79
|
- _includes/partials/get_day_hash.html
|
80
80
|
- _includes/partials/get_day_time.html
|
81
|
+
- _includes/partials/get_enable_map.html
|
81
82
|
- _includes/partials/get_link.html
|
82
83
|
- _includes/partials/get_link_types.html
|
83
84
|
- _includes/partials/get_live_timestamps.html
|
84
85
|
- _includes/partials/get_main_category.html
|
86
|
+
- _includes/partials/get_page_description.html
|
87
|
+
- _includes/partials/get_page_title.html
|
85
88
|
- _includes/partials/get_talk_time.html
|
86
89
|
- _includes/partials/get_talk_timestamp.html
|
87
90
|
- _includes/partials/get_time_pronoun.html
|
88
91
|
- _includes/partials/header.html
|
89
92
|
- _includes/partials/info_bar.html
|
90
93
|
- _includes/partials/list_categories.html
|
94
|
+
- _includes/partials/list_page_meta.html
|
91
95
|
- _includes/partials/list_speakers.html
|
92
96
|
- _includes/partials/list_sub_categories.html
|
93
97
|
- _includes/partials/modal_link.html
|
@@ -279,7 +283,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
279
283
|
- !ruby/object:Gem::Version
|
280
284
|
version: '0'
|
281
285
|
requirements: []
|
282
|
-
rubygems_version: 3.2.
|
286
|
+
rubygems_version: 3.2.32
|
283
287
|
signing_key:
|
284
288
|
specification_version: 4
|
285
289
|
summary: Jekyll template for a conference website containing program, speaker, talks
|