jekyll-theme-conference 2.5.0 → 2.5.1
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 +4 -4
- data/README.md +21 -3
- data/_includes/js/conference-live.js +199 -91
- data/_includes/partials/get_link.html +2 -2
- data/_includes/partials/header.html +13 -0
- data/_includes/partials/live-modal.html +9 -1
- data/_includes/partials/live_button.html +4 -4
- data/_includes/partials/navbar.html +2 -2
- data/_layouts/delete_hidden.html +25 -0
- data/_layouts/room.html +6 -3
- data/_layouts/speaker.html +5 -3
- data/_layouts/talk-overview.html +1 -1
- data/_layouts/talk.html +5 -3
- data/_sass/conference.scss +0 -5
- data/assets/icons/live.svg +6 -6
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a6617ea192ab16d014da7430f23276860d7ecce37cdd591815103bb086efb65
|
4
|
+
data.tar.gz: a31e631388e20578008dcef761e416a5a53c53166b068ecb410ee0f75b1f9196
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef931eb98d10bc467358f2948e76b15ac8d11a8abe1d7528688a5f672fcb8127a31cbe46165f41b355d58d186ca83a5d010d5b5cb0abfb41f685296c908421ae
|
7
|
+
data.tar.gz: a3ef7ee1df36b5280534f5819d10c21c2447f9430650e89d0aa4923243656d51d4e2483c888adfe2e30cfb18b0e0d40584add7dc4c3449ba997d604d1f6b9684
|
data/README.md
CHANGED
@@ -89,6 +89,10 @@ The different talks, speakers and rooms are stored as a collection of files. Eac
|
|
89
89
|
|
90
90
|
The actual schedule defining when and in which room a talk takes place is stored as a [YAML data file](https://jekyllrb.com/docs/datafiles/) under `_data/program.yml`. For further details about it see below in the section _Content_.
|
91
91
|
|
92
|
+
:warning: Please note that the generated website can be quite large containing many unnecessary whitespaces. It is recommended to minimize the generated output files before uploading them to a server (e.g. with [minify](https://github.com/tdewolff/minify)).
|
93
|
+
|
94
|
+
### Jump Start
|
95
|
+
|
92
96
|
In order to be up and running simply use the default content of this repository as an initial base for your new website. After having setup a new Jekyll website copy the following files and folders into the website's folder:
|
93
97
|
|
94
98
|
- `_config.example.yml` -> `_config.yml`
|
@@ -102,11 +106,23 @@ In order to be up and running simply use the default content of this repository
|
|
102
106
|
- `speakers/`
|
103
107
|
- `talks/`
|
104
108
|
|
105
|
-
|
109
|
+
### Automatic Import
|
110
|
+
|
111
|
+
There exists a Python file in this repository, `create_entries.py`, which can be used to import content from a [frab](https://github.com/frab/frab/wiki/Manual#introduction) compatible JSON file or a CSV table and generate the different talk, speakers and room files automatically based on it. Just open your terminal and type `python create_entries.py --help` to show the help and get started.
|
112
|
+
|
113
|
+
### Automatic Build
|
114
|
+
|
115
|
+
In case you do not want to install the entire Ruby/Jekyll toolchain on your machine you can make use of [GitHub Actions](https://github.com/features/actions), Github's continuous integration platform. This repository contains an example Github Action configuration file which automatically builds and minimizes the website upon adding a new tag. It then attaches the generated website as package to a release for easy downloading. Simply copy the following file to your repository and adapt it to your needs:
|
106
116
|
|
107
|
-
|
117
|
+
- `workflow-example.yml` -> `.github/workflows/main.yml`
|
108
118
|
|
109
|
-
|
119
|
+
Hidden rooms, speakers, or talks are automatically generated in way containing no content. In order to remove these empty files simply add a file called `delete_hidden.sh` to the root with the following content. It will automatically called by the Github Action workflow to delete the files.
|
120
|
+
|
121
|
+
```markdown
|
122
|
+
---
|
123
|
+
layout: delete_hidden
|
124
|
+
---
|
125
|
+
```
|
110
126
|
|
111
127
|
|
112
128
|
## Configuration
|
@@ -124,6 +140,8 @@ conference:
|
|
124
140
|
show_errors: false
|
125
141
|
```
|
126
142
|
|
143
|
+
:warning: Please be sure to disable this parameter for your production system.
|
144
|
+
|
127
145
|
### Collection URLs
|
128
146
|
|
129
147
|
The three required collections containing the files for the talks, speakers and rooms have to be specified in the `_config.yml` file. The first block declares them and sets the URL under which they will later be accessed. The second block defines the default layout for each of the collection.
|
@@ -1,4 +1,4 @@
|
|
1
|
-
window.conference.live = (function() {
|
1
|
+
window.conference.live = (function() {
|
2
2
|
{%- include partials/get_conf_time.html -%}
|
3
3
|
{%- assign time_start = conf_start -%}
|
4
4
|
{%- assign time_end = conf_end -%}
|
@@ -6,6 +6,7 @@ window.conference.live = (function() {
|
|
6
6
|
|
7
7
|
let confStart = {{ timestamp_start }};
|
8
8
|
let confEnd = {{ timestamp_end }};
|
9
|
+
let confDur = confEnd - confStart;
|
9
10
|
|
10
11
|
let freezeTime = false;
|
11
12
|
let timeFrozen = 0;
|
@@ -15,85 +16,126 @@ window.conference.live = (function() {
|
|
15
16
|
let durDemo = 5*60; // in seconds
|
16
17
|
let durPause = 10; // in seconds
|
17
18
|
|
19
|
+
let demoStart = confStart - confDur/durDemo*durPause;
|
20
|
+
let demoEnd = confEnd + confDur/durDemo*durPause;
|
21
|
+
|
18
22
|
let liveTimer;
|
19
|
-
let
|
23
|
+
let streamTimer;
|
24
|
+
|
25
|
+
let mod = function (n, m) {
|
26
|
+
return ((n % m) + m) % m;
|
27
|
+
};
|
20
28
|
|
21
|
-
let
|
22
|
-
// Return UNIX timestamp in seconds
|
29
|
+
let timeNow = function () {
|
23
30
|
return Math.floor(Date.now() / 1000);
|
24
31
|
};
|
25
32
|
|
26
|
-
let
|
27
|
-
|
28
|
-
|
29
|
-
|
33
|
+
let timeCont = function () {
|
34
|
+
return timeNow() - timeOffset;
|
35
|
+
};
|
36
|
+
|
37
|
+
let timeCycle = function () {
|
38
|
+
let actTime = timeNow();
|
39
|
+
let relTime = mod(actTime, durDemo + 2*durPause) / durDemo;
|
40
|
+
let cycleTime = mod((demoEnd - demoStart) * relTime - timeOffset, (demoEnd - demoStart)) + demoStart;
|
30
41
|
return cycleTime;
|
31
42
|
};
|
32
43
|
|
33
|
-
let
|
44
|
+
let time = function () {
|
34
45
|
if (freezeTime) {
|
35
46
|
return timeFrozen;
|
36
47
|
}
|
37
48
|
else if (demo) {
|
38
|
-
return
|
49
|
+
return timeCycle();
|
39
50
|
}
|
40
51
|
else {
|
41
|
-
return
|
52
|
+
return timeCont();
|
42
53
|
}
|
43
54
|
};
|
44
55
|
|
45
56
|
let pauseTime = function () {
|
46
|
-
|
47
|
-
|
57
|
+
if (!freezeTime) {
|
58
|
+
timeFrozen = time();
|
59
|
+
freezeTime = true;
|
60
|
+
|
61
|
+
stopUpdate();
|
62
|
+
}
|
48
63
|
};
|
49
64
|
|
50
65
|
let continueTime = function () {
|
51
|
-
if (
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
timeOffset = timeNow() - timeFrozen;
|
66
|
+
if (freezeTime) {
|
67
|
+
freezeTime = false;
|
68
|
+
timeOffset += time() - timeFrozen;
|
69
|
+
startUpdate();
|
56
70
|
}
|
57
|
-
freezeTime = false;
|
58
71
|
};
|
59
72
|
|
60
73
|
let resetTime = function (timeStr) {
|
61
|
-
continueTime();
|
62
74
|
timeOffset = 0;
|
75
|
+
freezeTime = false;
|
76
|
+
|
77
|
+
startUpdate();
|
63
78
|
};
|
64
79
|
|
65
|
-
let setTime = function (
|
80
|
+
let setTime = function (newTime) {
|
66
81
|
pauseTime();
|
67
82
|
|
68
|
-
let d = new Date(
|
69
|
-
|
70
|
-
d.setHours(
|
83
|
+
let d = new Date(confStart * 1000);
|
84
|
+
newTime = newTime.split(':');
|
85
|
+
d.setHours(newTime[0], newTime[1]);
|
71
86
|
|
72
87
|
timeFrozen = Math.floor(d.getTime() / 1000);
|
88
|
+
|
89
|
+
update();
|
73
90
|
};
|
74
91
|
|
75
|
-
let getTime = function () {
|
76
|
-
let d = new Date(
|
92
|
+
let getTime = function (tConvert = time()) {
|
93
|
+
let d = new Date(tConvert * 1000);
|
77
94
|
let h = d.getHours();
|
78
95
|
let m = d.getMinutes();
|
79
96
|
|
80
97
|
return h + ":" + (m < 10 ? "0" : "") + m;
|
81
98
|
};
|
82
99
|
|
83
|
-
let
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
100
|
+
let timeUnit = function () {
|
101
|
+
if (demo) {
|
102
|
+
return 0.1;
|
103
|
+
}
|
104
|
+
else {
|
105
|
+
return 60;
|
106
|
+
}
|
107
|
+
};
|
108
|
+
|
109
|
+
let delayStart = function (startTime) {
|
110
|
+
let tNow = time();
|
111
|
+
let tUnit = timeUnit();
|
112
|
+
|
113
|
+
if (demo) {
|
114
|
+
// Convert virtual duration to real duration
|
115
|
+
return mod(startTime - tNow, demoEnd - demoStart) / (demoEnd - demoStart) * (durDemo + 2*durPause);
|
88
116
|
}
|
89
117
|
else {
|
90
|
-
|
91
|
-
|
118
|
+
if (startTime > tNow) {
|
119
|
+
return startTime - tNow;
|
120
|
+
}
|
121
|
+
else {
|
122
|
+
// Start on the unit
|
123
|
+
return (tUnit - (tNow % tUnit));
|
124
|
+
}
|
92
125
|
}
|
93
126
|
};
|
94
127
|
|
95
|
-
let
|
96
|
-
|
128
|
+
let toggleDemo = function () {
|
129
|
+
demo = !demo;
|
130
|
+
resetTime();
|
131
|
+
};
|
132
|
+
|
133
|
+
let demoOn = function () {
|
134
|
+
return demo;
|
135
|
+
};
|
136
|
+
|
137
|
+
let updateLive = function () {
|
138
|
+
let tNow = time();
|
97
139
|
let liveShow = document.getElementsByClassName('live-show');
|
98
140
|
let liveHide = document.getElementsByClassName('live-hide');
|
99
141
|
|
@@ -127,39 +169,32 @@ window.conference.live = (function() {
|
|
127
169
|
}
|
128
170
|
}
|
129
171
|
|
130
|
-
if (
|
172
|
+
if (tNow > confEnd && !demo) {
|
131
173
|
// Cancel timer after program is over
|
132
|
-
|
174
|
+
stopUpdateLive();
|
133
175
|
}
|
134
176
|
};
|
135
177
|
|
136
|
-
let
|
137
|
-
|
138
|
-
|
139
|
-
}
|
140
|
-
updateLiveButtons();
|
178
|
+
let startUpdateLive = function () {
|
179
|
+
stopUpdateLive();
|
180
|
+
updateLive();
|
141
181
|
|
142
182
|
if (demo) {
|
143
|
-
|
144
|
-
liveTimer = setInterval(
|
183
|
+
// Immediate start required since delayStart would wait for next wrap around
|
184
|
+
liveTimer = setInterval(updateLive, timeUnit() * 1000);
|
145
185
|
}
|
146
186
|
else {
|
147
|
-
liveTimerCorr = 1;
|
148
187
|
setTimeout(function() {
|
149
|
-
liveTimer = setInterval(
|
150
|
-
|
151
|
-
},
|
188
|
+
liveTimer = setInterval(updateLive, timeUnit() * 1000);
|
189
|
+
updateLive();
|
190
|
+
}, delayStart(confStart) * 1000);
|
152
191
|
}
|
153
192
|
};
|
154
193
|
|
155
|
-
let
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
};
|
160
|
-
|
161
|
-
let demoOn = function() {
|
162
|
-
return demo;
|
194
|
+
let stopUpdateLive = function () {
|
195
|
+
if (typeof liveTimer !== "undefined") {
|
196
|
+
clearInterval(liveTimer);
|
197
|
+
}
|
163
198
|
};
|
164
199
|
|
165
200
|
{% if site.conference.live.streaming -%}
|
@@ -198,65 +233,102 @@ window.conference.live = (function() {
|
|
198
233
|
};
|
199
234
|
|
200
235
|
let streamModal;
|
201
|
-
let streamTimer;
|
202
236
|
|
203
|
-
let
|
237
|
+
let getRoom = function (roomName) {
|
238
|
+
if (roomName in rooms) {
|
239
|
+
return rooms[roomName];
|
240
|
+
}
|
241
|
+
else {
|
242
|
+
return rooms[Object.keys(rooms)[0]];
|
243
|
+
}
|
244
|
+
};
|
245
|
+
|
246
|
+
let preStartStream = function (roomName) {
|
247
|
+
let room = getRoom(roomName);
|
248
|
+
|
204
249
|
streamModal.find('iframe').attr('src', '');
|
205
250
|
streamModal.find('iframe').addClass('d-none');
|
206
251
|
streamModal.find('#stream-placeholder > div').text('{{ site.data.lang[site.conference.lang].live.pre_stream | default: "Live stream has not started yet." }}');
|
207
252
|
streamModal.find('#stream-placeholder').addClass('d-flex');
|
208
253
|
|
209
|
-
|
210
|
-
|
254
|
+
stopUpdateStream();
|
255
|
+
if (!freezeTime) {
|
256
|
+
streamTimer = setTimeout(activeStream, delayStart(room.start) * 1000, roomName);
|
211
257
|
}
|
212
|
-
|
213
|
-
|
258
|
+
};
|
259
|
+
|
260
|
+
let activeStream = function (roomName) {
|
261
|
+
let room = getRoom(roomName);
|
214
262
|
|
215
|
-
|
216
|
-
streamModal.find('iframe').attr('src', href);
|
263
|
+
streamModal.find('iframe').attr('src', room.href);
|
217
264
|
streamModal.find('#stream-placeholder').addClass('d-none').removeClass('d-flex');
|
218
265
|
streamModal.find('iframe').removeClass('d-none');
|
219
266
|
|
220
|
-
|
221
|
-
|
267
|
+
stopUpdateStream();
|
268
|
+
if (!freezeTime) {
|
269
|
+
streamTimer = setTimeout(postEndStream, delayStart(room.end) * 1000, roomName);
|
222
270
|
}
|
223
|
-
|
224
|
-
|
271
|
+
};
|
272
|
+
|
273
|
+
let postEndStream = function (roomName) {
|
274
|
+
let room = getRoom(roomName);
|
225
275
|
|
226
|
-
let postEndStream = function() {
|
227
276
|
streamModal.find('iframe').attr('src', '');
|
228
277
|
streamModal.find('iframe').addClass('d-none');
|
229
278
|
streamModal.find('#stream-placeholder > div').text('{{ site.data.lang[site.conference.lang].live.post_stream | default: "Live stream has ended." }}');
|
230
279
|
streamModal.find('#stream-placeholder').addClass('d-flex');
|
231
|
-
}
|
232
280
|
|
233
|
-
|
234
|
-
if (
|
235
|
-
|
236
|
-
}
|
237
|
-
else {
|
238
|
-
room = rooms[Object.keys(rooms)[0]];
|
281
|
+
stopUpdateStream();
|
282
|
+
if (!freezeTime && demo) {
|
283
|
+
streamTimer = setTimeout(preStartStream, delayStart(demoStart) * 1000, roomName);
|
239
284
|
}
|
285
|
+
};
|
240
286
|
|
287
|
+
let setStream = function (roomName) {
|
241
288
|
streamModal.find('.modal-footer .btn').removeClass('active');
|
242
|
-
|
243
|
-
|
289
|
+
streamModal.find('#stream-select').selectedIndex = -1;
|
290
|
+
|
291
|
+
let room = getRoom(roomName);
|
292
|
+
let tNow = time();
|
293
|
+
|
294
|
+
if (tNow < room.start) {
|
295
|
+
preStartStream(roomName);
|
244
296
|
}
|
245
|
-
else if (
|
246
|
-
postEndStream();
|
297
|
+
else if (tNow > room.end) {
|
298
|
+
postEndStream(roomName);
|
247
299
|
}
|
248
300
|
else {
|
249
|
-
activeStream(
|
301
|
+
activeStream(roomName);
|
250
302
|
}
|
303
|
+
|
251
304
|
streamModal.find('#stream-button' + room.id).addClass('active');
|
305
|
+
streamModal.find('#stream-select').selectedIndex = room.id;
|
306
|
+
};
|
307
|
+
|
308
|
+
let updateStream = function () {
|
309
|
+
if (streamModal.hasClass('show')) {
|
310
|
+
let activeButton = streamModal.find('.modal-footer .btn.active');
|
311
|
+
let roomName = activeButton.data('room');
|
312
|
+
|
313
|
+
if (typeof roomName !== "undefined") {
|
314
|
+
setStream(roomName);
|
315
|
+
}
|
316
|
+
}
|
317
|
+
};
|
318
|
+
|
319
|
+
let stopUpdateStream = function () {
|
320
|
+
if (typeof streamTimer !== "undefined") {
|
321
|
+
clearInterval(streamTimer);
|
322
|
+
}
|
252
323
|
};
|
253
324
|
|
254
325
|
let hideModal = function (event) {
|
255
326
|
streamModal.find('iframe').attr('src', '');
|
256
327
|
streamModal.find('.modal-footer .btn').removeClass('active');
|
328
|
+
streamModal.find('#stream-select').selectedIndex = -1;
|
257
329
|
};
|
258
330
|
|
259
|
-
let
|
331
|
+
let setupStream = function () {
|
260
332
|
streamModal = $('#stream-modal');
|
261
333
|
|
262
334
|
streamModal.on('show.bs.modal', function (event) {
|
@@ -271,24 +343,60 @@ window.conference.live = (function() {
|
|
271
343
|
streamModal.find('.modal-footer .btn').on('click', function(event) {
|
272
344
|
event.preventDefault();
|
273
345
|
|
274
|
-
let roomName = $(this).data('room')
|
346
|
+
let roomName = $(this).data('room');
|
347
|
+
setStream(roomName);
|
348
|
+
});
|
349
|
+
|
350
|
+
streamModal.find('#stream-select').on('change', function(event) {
|
351
|
+
event.preventDefault();
|
352
|
+
|
353
|
+
let roomName = $(this).children('option:selected').text();
|
275
354
|
setStream(roomName);
|
276
355
|
});
|
277
356
|
};
|
278
357
|
|
358
|
+
let setup = function () {
|
359
|
+
startUpdateLive();
|
360
|
+
setupStream();
|
361
|
+
};
|
362
|
+
|
363
|
+
let update = function () {
|
364
|
+
updateLive();
|
365
|
+
updateStream();
|
366
|
+
};
|
367
|
+
|
368
|
+
let startUpdate = function () {
|
369
|
+
startUpdateLive();
|
370
|
+
updateStream();
|
371
|
+
};
|
372
|
+
|
373
|
+
let stopUpdate = function () {
|
374
|
+
stopUpdateLive();
|
375
|
+
stopUpdateStream();
|
376
|
+
};
|
377
|
+
|
279
378
|
{%- else -%}
|
280
379
|
|
281
|
-
let
|
380
|
+
let setup = function () {
|
381
|
+
startUpdateLive();
|
382
|
+
};
|
282
383
|
|
283
|
-
|
384
|
+
let update = function () {
|
385
|
+
updateLive();
|
386
|
+
};
|
284
387
|
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
388
|
+
let startUpdate = function () {
|
389
|
+
startUpdateLive();
|
390
|
+
};
|
391
|
+
|
392
|
+
let stopUpdate = function () {
|
393
|
+
stopUpdateLive();
|
394
|
+
};
|
395
|
+
|
396
|
+
{%- endif %}
|
289
397
|
|
290
398
|
return {
|
291
|
-
init:
|
399
|
+
init: setup,
|
292
400
|
|
293
401
|
pauseTime: pauseTime,
|
294
402
|
continueTime: continueTime,
|
@@ -297,7 +405,7 @@ window.conference.live = (function() {
|
|
297
405
|
getTime: getTime,
|
298
406
|
|
299
407
|
toggleDemo: toggleDemo,
|
300
|
-
|
408
|
+
demo: demoOn,
|
301
409
|
durDemo: durDemo,
|
302
410
|
durPause: durPause
|
303
411
|
};
|
@@ -67,10 +67,10 @@
|
|
67
67
|
|
68
68
|
{% capture link_tag -%}
|
69
69
|
{%- if link.disabled -%}
|
70
|
-
<a class="disabled{% if link_styleclass %} {{ link_styleclass }}{% endif %}">
|
70
|
+
<a class="disabled{% if link_styleclass %} {{ link_styleclass }}{% endif %}" href="#">
|
71
71
|
|
72
72
|
{%- elsif link_iframe -%}
|
73
|
-
<a
|
73
|
+
<a {% if link_styleclass %}class="{{ link_styleclass }}"{% endif %} title="{{ link.name }}" data-toggle="modal" data-target="#link-modal" data-href="{{ link_href }}" href="#" {% if modal_header -%}
|
74
74
|
data-header="{{ modal_header | strip_newlines | escape }}"
|
75
75
|
{%- elsif modal_title -%}
|
76
76
|
data-title="{{ modal_title }}"
|
@@ -8,8 +8,21 @@
|
|
8
8
|
<title>
|
9
9
|
{% unless page.name contains '.' %}{{ page.name }} - {% else %}{% if page.title %}{{ page.title }} - {% endif %}{% endunless %}{{ site.title }}
|
10
10
|
</title>
|
11
|
+
<meta name="description" content="{{ site.description }}" />
|
11
12
|
|
12
13
|
<link rel="stylesheet" href="{{ site.baseurl }}/assets/css/main.css" />
|
14
|
+
|
15
|
+
{%- if site.conference.live -%}
|
16
|
+
<link rel="prefetch" href="{{ site.baseurl }}/assets/icons/live.svg" />
|
17
|
+
{%- endif -%}
|
18
|
+
|
19
|
+
{%- if site.conference.live.streaming -%}
|
20
|
+
{%- for room in site.rooms -%}
|
21
|
+
{%- if room.live -%}
|
22
|
+
<link rel="preconnect" href="{{ room.live }}" />
|
23
|
+
{%- endif -%}
|
24
|
+
{%- endfor -%}
|
25
|
+
{%- endif -%}
|
13
26
|
</head>
|
14
27
|
|
15
28
|
<body class="pb-4">
|
@@ -19,10 +19,18 @@
|
|
19
19
|
{% for r in site.data.program %}
|
20
20
|
{% assign room = site.rooms | where: 'name', r.room | first %}
|
21
21
|
|
22
|
-
<a id="stream-button{{ forloop.index }}" href="#" class="btn btn-outline-primary {% unless room.live %}disabled{% endunless %}" role="button" data-room="{{ room.name }}">
|
22
|
+
<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 }}">
|
23
23
|
{{ room.name }}
|
24
24
|
</a>
|
25
25
|
{% endfor %}
|
26
|
+
<div class="form-group w-100 d-block d-sm-none">
|
27
|
+
<select class="form-control" id="stream-select">
|
28
|
+
{% for r in site.data.program %}
|
29
|
+
{% assign room = site.rooms | where: 'name', r.room | first %}
|
30
|
+
<option {% unless room.live %}disabled{% endunless %}>{{ room.name }}</option>
|
31
|
+
{% endfor %}
|
32
|
+
</select>
|
33
|
+
</div>
|
26
34
|
</div>
|
27
35
|
</div>
|
28
36
|
</div>
|
@@ -4,11 +4,11 @@
|
|
4
4
|
{% include partials/get_timestamp.html %}
|
5
5
|
|
6
6
|
{%- if site.conference.live.streaming -%}
|
7
|
-
<a title="{{ link.name }}" data-toggle="modal" data-target="#stream-modal" data-room="{{ r.room }}"
|
7
|
+
<a title="{{ link.name }}" data-toggle="modal" data-target="#stream-modal" data-room="{{ r.room }}" href="#"
|
8
8
|
{%- else -%}
|
9
|
-
<span
|
10
|
-
{%- endif %} live-show live-button badge badge-dark font-weight-normal text-left d-none {{ live_button_styleclass }}" data-start="{{ timestamp_start }}" data-end="{{ timestamp_end }}">
|
11
|
-
<object data="{{ site.baseurl }}/assets/icons/live.svg" type="image/svg+xml"
|
9
|
+
<span
|
10
|
+
{%- endif %} class="live-show live-button badge badge-dark font-weight-normal text-left d-none {{ live_button_styleclass }}" data-start="{{ timestamp_start }}" data-end="{{ timestamp_end }}">
|
11
|
+
<object data="{{ site.baseurl }}/assets/icons/live.svg" type="image/svg+xml">!</object>
|
12
12
|
{{ site.data.lang[site.conference.lang].live.live | default: "Live" }}
|
13
13
|
{%- if site.conference.live.streaming -%}
|
14
14
|
</a>
|
@@ -40,7 +40,7 @@
|
|
40
40
|
|
41
41
|
<li class="nav-item live-show d-none" data-start="{{ timestamp_start }}" data-end="{{ timestamp_end }}">
|
42
42
|
{% if site.conference.live.streaming %}
|
43
|
-
<a class="
|
43
|
+
<a class="nav-link" title="{% if link.name %}{{ link.name }}{% else %}{{ site.data.lang[site.conference.lang].live.streaming | default: "Live Stream" }}{% endif %}" data-toggle="modal" data-target="#stream-modal" data-room="" href="#">
|
44
44
|
{% else %}
|
45
45
|
{% assign link_styleclass = "nav-link" %}
|
46
46
|
{% include partials/get_link.html %}
|
@@ -50,7 +50,7 @@
|
|
50
50
|
{{ link.name | default: "" }}
|
51
51
|
|
52
52
|
<span class="live-button badge badge-dark font-weight-normal text-left">
|
53
|
-
<object data="{{ site.baseurl }}/assets/icons/live.svg" type="image/svg+xml"
|
53
|
+
<object data="{{ site.baseurl }}/assets/icons/live.svg" type="image/svg+xml">!</object>
|
54
54
|
{{ site.data.lang[site.conference.lang].live.live | default: "Live" }}
|
55
55
|
</span>
|
56
56
|
</a>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
{% if site.conference.location.hide -%}
|
4
|
+
rm -r rooms
|
5
|
+
rm -r {{ site.conference.location.url | default: "location" }}
|
6
|
+
{% else -%}
|
7
|
+
{%- for room in site.rooms -%}
|
8
|
+
{%- if room.hide -%}
|
9
|
+
rm -r {{ room.url | slice: 1, room.url.size }}
|
10
|
+
{% endif -%}
|
11
|
+
{%- endfor -%}
|
12
|
+
{%- endif -%}
|
13
|
+
|
14
|
+
{%- for speaker in site.speakers -%}
|
15
|
+
{%- if speaker.hide -%}
|
16
|
+
rm -r {{ speaker.url | slice: 1, speaker.url.size }}
|
17
|
+
{% endif -%}
|
18
|
+
{%- endfor -%}
|
19
|
+
|
20
|
+
{%- for talk in site.talks -%}
|
21
|
+
{%- if talk.hide -%}
|
22
|
+
rm -r {{ talk.url | slice: 1, talk.url.size }}
|
23
|
+
{% endif -%}
|
24
|
+
{%- endfor %}
|
25
|
+
rm delete_hidden.sh
|
data/_layouts/room.html
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
{
|
1
|
+
{%- assign this_room = page -%}
|
2
|
+
|
3
|
+
{%- unless this_room.hide or site.conference.location.hide -%}
|
4
|
+
{%- include partials/header.html -%}
|
2
5
|
|
3
6
|
<!-- title for print: -->
|
4
7
|
<h1 class="display-5 mb-3 d-none d-print-inline">
|
@@ -10,7 +13,6 @@
|
|
10
13
|
{{ site.data.lang[site.conference.lang].location.title | default: "Location" }}
|
11
14
|
</h1>
|
12
15
|
|
13
|
-
{% assign this_room = page %}
|
14
16
|
{% include partials/navbar_rooms.html %}
|
15
17
|
|
16
18
|
{{ content }}
|
@@ -60,4 +62,5 @@
|
|
60
62
|
|
61
63
|
</ul>
|
62
64
|
|
63
|
-
{
|
65
|
+
{%- include partials/footer.html -%}
|
66
|
+
{%- endunless -%}
|
data/_layouts/speaker.html
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
{
|
1
|
+
{%- assign speaker = page -%}
|
2
2
|
|
3
|
-
|
3
|
+
{%- unless speaker.hide -%}
|
4
|
+
{%- include partials/header.html -%}
|
4
5
|
|
5
6
|
<p class="h6">
|
6
7
|
{{ site.data.lang[site.conference.lang].speaker.title | default: "Speaker" }}
|
@@ -104,4 +105,5 @@
|
|
104
105
|
</a>
|
105
106
|
</p>
|
106
107
|
|
107
|
-
{
|
108
|
+
{%- include partials/footer.html -%}
|
109
|
+
{%- endunless -%}
|
data/_layouts/talk-overview.html
CHANGED
data/_layouts/talk.html
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
{
|
1
|
+
{%- assign talk = page -%}
|
2
2
|
|
3
|
-
|
3
|
+
{%- unless talk.hide -%}
|
4
|
+
{%- include partials/header.html -%}
|
4
5
|
|
5
6
|
<div class="d-flex flex-lg-row flex-column container-fluid mb-2 p-0">
|
6
7
|
<div class="h6 mt-2 mb-0 mr-1 pr-1 pb-1">
|
@@ -119,4 +120,5 @@
|
|
119
120
|
</a>
|
120
121
|
</p>
|
121
122
|
|
122
|
-
{
|
123
|
+
{%- include partials/footer.html -%}
|
124
|
+
{%- endunless -%}
|
data/_sass/conference.scss
CHANGED
data/assets/icons/live.svg
CHANGED
@@ -25,7 +25,7 @@
|
|
25
25
|
attributeName="opacity"
|
26
26
|
from="0"
|
27
27
|
to="0"
|
28
|
-
dur="
|
28
|
+
dur="500ms"
|
29
29
|
begin="0s;dot_animate.end+7.35s" />
|
30
30
|
<animate
|
31
31
|
id="dot_animate"
|
@@ -33,7 +33,7 @@
|
|
33
33
|
attributeName="opacity"
|
34
34
|
from="0"
|
35
35
|
to="1"
|
36
|
-
dur="
|
36
|
+
dur="150ms"
|
37
37
|
begin="dot_hide.end" />
|
38
38
|
</path>
|
39
39
|
<path
|
@@ -46,7 +46,7 @@
|
|
46
46
|
attributeName="opacity"
|
47
47
|
from="0"
|
48
48
|
to="0"
|
49
|
-
dur="
|
49
|
+
dur="650ms"
|
50
50
|
begin="dot_hide.begin" />
|
51
51
|
<animate
|
52
52
|
id="arc_small_animate"
|
@@ -54,7 +54,7 @@
|
|
54
54
|
attributeName="opacity"
|
55
55
|
from="0"
|
56
56
|
to="1"
|
57
|
-
dur="
|
57
|
+
dur="200ms"
|
58
58
|
begin="arc_small_hide.end" />
|
59
59
|
</path>
|
60
60
|
<path
|
@@ -67,7 +67,7 @@
|
|
67
67
|
attributeName="opacity"
|
68
68
|
from="0"
|
69
69
|
to="0"
|
70
|
-
dur="
|
70
|
+
dur="850ms"
|
71
71
|
begin="dot_hide.begin" />
|
72
72
|
<animate
|
73
73
|
id="arc_large_animate"
|
@@ -75,7 +75,7 @@
|
|
75
75
|
attributeName="opacity"
|
76
76
|
from="0"
|
77
77
|
to="1"
|
78
|
-
dur="
|
78
|
+
dur="250ms"
|
79
79
|
begin="arc_large_hide.end" />
|
80
80
|
</path>
|
81
81
|
</svg>
|
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: 2.5.
|
4
|
+
version: 2.5.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: 2020-11-
|
11
|
+
date: 2020-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- _includes/partials/show_talk_duration.html
|
96
96
|
- _includes/partials/show_talk_time.html
|
97
97
|
- _layouts/default.html
|
98
|
+
- _layouts/delete_hidden.html
|
98
99
|
- _layouts/home.html
|
99
100
|
- _layouts/location.html
|
100
101
|
- _layouts/page.html
|