jekyll-theme-conference 2.5.0 → 2.5.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 +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
|