jekyll-theme-conference 3.1.0 → 3.1.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 +35 -0
- data/_includes/js/conference-live.js +57 -15
- data/_includes/js/conference-map.js +1 -1
- data/_includes/js/conference-modal.js +4 -4
- data/_includes/js/conference-program.js +1 -1
- data/_includes/js/syncscroll.js +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 91444cf0a7c14c4e1d4a10547c95fd9c6a10b176db297a2071830f2a634052c0
|
|
4
|
+
data.tar.gz: 5c16b5f374876f5bde05ff91c0e121133843f31ad42701ef8336b523933101ba
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c2e410318beee836c5d3371185d5e5386f24a28c34061eeb0fc407ec68715326e55f9344021b93c2ded7631df376c45723fbeac84a3e7ae9c5f7a781e981abcc
|
|
7
|
+
data.tar.gz: a3a3fefe3e080e42fdf24923fe36189593aeaafd87a2e90624ce42a2fa6ba766a5436201cbb63a5e7b34fba71ea695e05a9ddbadf13352fddc4792c8423444f9
|
data/README.md
CHANGED
|
@@ -18,6 +18,41 @@ The theme was originally created for the yearly Winterkongress conference of the
|
|
|
18
18
|
- [Demo: Winterkongress](https://digitale-gesellschaft.ch/kongress/)
|
|
19
19
|
|
|
20
20
|
|
|
21
|
+
## Table of Contents
|
|
22
|
+
|
|
23
|
+
- [Installation](#installation)
|
|
24
|
+
* [Gem-based Method](#gem-based-method)
|
|
25
|
+
* [Remote Theme Method](#remote-theme-method)
|
|
26
|
+
- [Setup](#setup)
|
|
27
|
+
* [Jump Start](#jump-start)
|
|
28
|
+
* [Automatic Import](#automatic-import)
|
|
29
|
+
* [Automatic Build](#automatic-build)
|
|
30
|
+
- [Configuration](#configuration)
|
|
31
|
+
* [Theme Verification](#theme-verification)
|
|
32
|
+
* [Collection URLs](#collection-urls)
|
|
33
|
+
* [Language](#language)
|
|
34
|
+
* [Navigation Bar](#navigation-bar)
|
|
35
|
+
* [Main Landing Page](#main-landing-page)
|
|
36
|
+
* [Information Boxes](#information-boxes)
|
|
37
|
+
* [Live Indications & Streaming](#live-indications---streaming)
|
|
38
|
+
* [Talk Settings](#talk-settings)
|
|
39
|
+
* [Speaker Settings](#speaker-settings)
|
|
40
|
+
* [Location Settings](#location-settings)
|
|
41
|
+
* [Program Settings](#program-settings)
|
|
42
|
+
- [Content](#content)
|
|
43
|
+
* [Schedule / Program](#schedule---program)
|
|
44
|
+
* [Talks](#talks)
|
|
45
|
+
* [Speakers](#speakers)
|
|
46
|
+
* [Rooms](#rooms)
|
|
47
|
+
* [Links](#links)
|
|
48
|
+
- [Overview Pages](#overview-pages)
|
|
49
|
+
* [Location / Room Overview](#location---room-overview)
|
|
50
|
+
* [Live Stream Overview](#live-stream-overview)
|
|
51
|
+
* [Additional Pages](#additional-pages)
|
|
52
|
+
- [Design](#design)
|
|
53
|
+
- [License](#license)
|
|
54
|
+
|
|
55
|
+
|
|
21
56
|
## Installation
|
|
22
57
|
|
|
23
58
|
There are three ways to install: As a [Gem-based theme](https://jekyllrb.com/docs/themes/#understanding-gem-based-themes), as a [remote theme](https://github.blog/2017-11-29-use-any-theme-with-github-pages/) (GitHub Pages compatible), or by cloning/forking this repository and reference to it directly.
|
|
@@ -35,28 +35,34 @@ window.conference.live = (function() {
|
|
|
35
35
|
let streamInfoTimer;
|
|
36
36
|
|
|
37
37
|
let loadData = function () {
|
|
38
|
+
// Fetch schedule from external file
|
|
38
39
|
$.getJSON('{{ site.baseurl }}/assets/js/data.json', function(json) {
|
|
39
40
|
data = json;
|
|
40
41
|
});
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
let getData = function () {
|
|
45
|
+
// Return data
|
|
44
46
|
return data;
|
|
45
47
|
};
|
|
46
48
|
|
|
47
49
|
let mod = function (n, m) {
|
|
50
|
+
// Absolute modulo
|
|
48
51
|
return ((n % m) + m) % m;
|
|
49
52
|
};
|
|
50
53
|
|
|
51
54
|
let timeNow = function () {
|
|
55
|
+
// Current timestamp in seconds
|
|
52
56
|
return Math.floor(Date.now() / 1000);
|
|
53
57
|
};
|
|
54
58
|
|
|
55
59
|
let timeCont = function () {
|
|
60
|
+
// Continuous time (respecting previous pauses)
|
|
56
61
|
return timeNow() - timeOffset;
|
|
57
62
|
};
|
|
58
63
|
|
|
59
64
|
let timeCycle = function () {
|
|
65
|
+
// Cyclic timestamp in seconds
|
|
60
66
|
let actTime = timeNow();
|
|
61
67
|
let relTime = mod(actTime, durDemo + 2*durPause) / (durDemo + 2*durPause);
|
|
62
68
|
let cycleTime = mod((demoEnd - demoStart) * relTime - timeOffset, (demoEnd - demoStart)) + demoStart;
|
|
@@ -64,6 +70,7 @@ window.conference.live = (function() {
|
|
|
64
70
|
};
|
|
65
71
|
|
|
66
72
|
let time = function () {
|
|
73
|
+
// Return app time
|
|
67
74
|
if (freezeTime) {
|
|
68
75
|
return timeFrozen;
|
|
69
76
|
}
|
|
@@ -76,6 +83,7 @@ window.conference.live = (function() {
|
|
|
76
83
|
};
|
|
77
84
|
|
|
78
85
|
let pauseTime = function () {
|
|
86
|
+
// Pause app time
|
|
79
87
|
if (!freezeTime) {
|
|
80
88
|
timeFrozen = time();
|
|
81
89
|
freezeTime = true;
|
|
@@ -85,6 +93,7 @@ window.conference.live = (function() {
|
|
|
85
93
|
};
|
|
86
94
|
|
|
87
95
|
let continueTime = function () {
|
|
96
|
+
// Continue app time
|
|
88
97
|
if (freezeTime) {
|
|
89
98
|
freezeTime = false;
|
|
90
99
|
timeOffset += time() - timeFrozen;
|
|
@@ -92,18 +101,23 @@ window.conference.live = (function() {
|
|
|
92
101
|
}
|
|
93
102
|
};
|
|
94
103
|
|
|
95
|
-
let resetTime = function (
|
|
104
|
+
let resetTime = function () {
|
|
105
|
+
// Reset app time
|
|
96
106
|
timeOffset = 0;
|
|
97
107
|
freezeTime = false;
|
|
98
108
|
|
|
99
109
|
startUpdate();
|
|
100
110
|
};
|
|
101
111
|
|
|
102
|
-
let setTime = function (newTime, newDay
|
|
112
|
+
let setTime = function (newTime, newDay) {
|
|
113
|
+
// Set and pause app time
|
|
103
114
|
pauseTime();
|
|
104
115
|
|
|
105
116
|
let dayIdx;
|
|
106
|
-
if (
|
|
117
|
+
if (arguments.length < 2) {
|
|
118
|
+
dayIdx = 0;
|
|
119
|
+
}
|
|
120
|
+
else if (Number.isInteger(newDay)) {
|
|
107
121
|
dayIdx = newDay-1;
|
|
108
122
|
}
|
|
109
123
|
else if (/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(newDay)) {
|
|
@@ -112,7 +126,7 @@ window.conference.live = (function() {
|
|
|
112
126
|
else {
|
|
113
127
|
dayIdx = data.days.find(o => o.name === newDay);
|
|
114
128
|
}
|
|
115
|
-
newDate = data.days[dayIdx].date;
|
|
129
|
+
let newDate = data.days[dayIdx].date;
|
|
116
130
|
|
|
117
131
|
let d = new Date(newDate);
|
|
118
132
|
newTime = newTime.split(':');
|
|
@@ -123,7 +137,10 @@ window.conference.live = (function() {
|
|
|
123
137
|
update();
|
|
124
138
|
};
|
|
125
139
|
|
|
126
|
-
let getTime = function (
|
|
140
|
+
let getTime = function () {
|
|
141
|
+
// Return app time as string
|
|
142
|
+
let tConvert = time();
|
|
143
|
+
|
|
127
144
|
let d = new Date(tConvert * 1000);
|
|
128
145
|
let dStr = d.toISOString().slice(0,10);
|
|
129
146
|
let h = d.getHours();
|
|
@@ -133,6 +150,7 @@ window.conference.live = (function() {
|
|
|
133
150
|
};
|
|
134
151
|
|
|
135
152
|
let timeUnit = function () {
|
|
153
|
+
// App time refresh rate
|
|
136
154
|
if (demo) {
|
|
137
155
|
return 0.1;
|
|
138
156
|
}
|
|
@@ -142,6 +160,7 @@ window.conference.live = (function() {
|
|
|
142
160
|
};
|
|
143
161
|
|
|
144
162
|
let delayStart = function (startTime) {
|
|
163
|
+
// Seconds until given startTime occurs
|
|
145
164
|
let tNow = time();
|
|
146
165
|
let tUnit = timeUnit();
|
|
147
166
|
|
|
@@ -161,21 +180,25 @@ window.conference.live = (function() {
|
|
|
161
180
|
};
|
|
162
181
|
|
|
163
182
|
let toggleDemo = function () {
|
|
183
|
+
// Toggle app demo mode
|
|
164
184
|
demo = !demo;
|
|
165
185
|
resetTime();
|
|
166
186
|
};
|
|
167
187
|
|
|
168
188
|
let demoOn = function () {
|
|
189
|
+
// Return app demo status
|
|
169
190
|
return demo;
|
|
170
191
|
};
|
|
171
192
|
|
|
172
193
|
let updateLive = function () {
|
|
194
|
+
// Update status all live elements in DOM
|
|
173
195
|
let tNow = time();
|
|
174
196
|
let liveShow = document.getElementsByClassName('live-show');
|
|
175
197
|
let liveHide = document.getElementsByClassName('live-hide');
|
|
176
198
|
let liveTime = document.getElementsByClassName('live-time');
|
|
177
199
|
let livePast = document.getElementsByClassName('live-past');
|
|
178
200
|
|
|
201
|
+
// Show elements for a given period
|
|
179
202
|
for (let i = 0; i < liveShow.length; i++) {
|
|
180
203
|
let tStarts = liveShow[i].dataset.start.split(',');
|
|
181
204
|
let tEnds = liveShow[i].dataset.end.split(',');
|
|
@@ -193,6 +216,7 @@ window.conference.live = (function() {
|
|
|
193
216
|
}
|
|
194
217
|
}
|
|
195
218
|
|
|
219
|
+
// Hide elements for a given period
|
|
196
220
|
for (let i = 0; i < liveHide.length; i++) {
|
|
197
221
|
let tStarts = liveHide[i].dataset.start.split(',');
|
|
198
222
|
let tEnds = liveHide[i].dataset.end.split(',');
|
|
@@ -212,6 +236,7 @@ window.conference.live = (function() {
|
|
|
212
236
|
}
|
|
213
237
|
}
|
|
214
238
|
|
|
239
|
+
// Update duration string for given elements
|
|
215
240
|
for (let i = 0; i < liveTime.length; i++) {
|
|
216
241
|
let t = liveTime[i].dataset.time;
|
|
217
242
|
if (typeof t == "undefined") {
|
|
@@ -271,6 +296,7 @@ window.conference.live = (function() {
|
|
|
271
296
|
liveTime[i].innerHTML = tStr;
|
|
272
297
|
}
|
|
273
298
|
|
|
299
|
+
// Disable elements for a given period
|
|
274
300
|
for (let i = 0; i < livePast.length; i++) {
|
|
275
301
|
let t = livePast[i].dataset.time;
|
|
276
302
|
if (typeof t == "undefined") {
|
|
@@ -290,13 +316,14 @@ window.conference.live = (function() {
|
|
|
290
316
|
}
|
|
291
317
|
}
|
|
292
318
|
|
|
319
|
+
// Cancel timer after program is over
|
|
293
320
|
if (tNow > confEnd && !demo) {
|
|
294
|
-
// Cancel timer after program is over
|
|
295
321
|
stopUpdateLive();
|
|
296
322
|
}
|
|
297
323
|
};
|
|
298
324
|
|
|
299
325
|
let startUpdateLive = function () {
|
|
326
|
+
// Start update timer to update live elements in DOM
|
|
300
327
|
stopUpdateLive();
|
|
301
328
|
updateLive();
|
|
302
329
|
|
|
@@ -313,6 +340,7 @@ window.conference.live = (function() {
|
|
|
313
340
|
};
|
|
314
341
|
|
|
315
342
|
let stopUpdateLive = function () {
|
|
343
|
+
// stopUpdate update timer to update live elements in DOM
|
|
316
344
|
if (typeof liveTimer !== "undefined") {
|
|
317
345
|
clearInterval(liveTimer);
|
|
318
346
|
}
|
|
@@ -326,6 +354,7 @@ window.conference.live = (function() {
|
|
|
326
354
|
let streamModal;
|
|
327
355
|
|
|
328
356
|
let getRoom = function (roomName) {
|
|
357
|
+
// Return room object for given room name
|
|
329
358
|
if (roomName in data.rooms) {
|
|
330
359
|
return data.rooms[roomName];
|
|
331
360
|
}
|
|
@@ -335,6 +364,7 @@ window.conference.live = (function() {
|
|
|
335
364
|
};
|
|
336
365
|
|
|
337
366
|
let getNextTalk = function (roomName) {
|
|
367
|
+
// Get talk object for next talk in given room
|
|
338
368
|
let timeNow = time();
|
|
339
369
|
let talksHere = data.talks[roomName];
|
|
340
370
|
|
|
@@ -351,6 +381,7 @@ window.conference.live = (function() {
|
|
|
351
381
|
};
|
|
352
382
|
|
|
353
383
|
let getNextPause = function (roomName) {
|
|
384
|
+
// Get time object for next pause in given room
|
|
354
385
|
let timeNow = time();
|
|
355
386
|
let talksHere = data.talks[roomName];
|
|
356
387
|
|
|
@@ -369,20 +400,24 @@ window.conference.live = (function() {
|
|
|
369
400
|
return false;
|
|
370
401
|
};
|
|
371
402
|
|
|
372
|
-
let
|
|
403
|
+
let setStreamIframeContent = function (content) {
|
|
404
|
+
// Set stream modal iframe to show given text
|
|
373
405
|
streamModal.find('iframe').attr('src', '');
|
|
374
406
|
streamModal.find('iframe').addClass('d-none');
|
|
375
407
|
streamModal.find('#stream-placeholder > div').text(content);
|
|
376
408
|
streamModal.find('#stream-placeholder').addClass('d-flex');
|
|
377
409
|
};
|
|
378
410
|
|
|
379
|
-
let
|
|
411
|
+
let setStreamIframeSrc = function (href) {
|
|
412
|
+
// Set stream modal iframe to show given URL
|
|
380
413
|
streamModal.find('iframe').attr('src', href);
|
|
381
414
|
streamModal.find('#stream-placeholder').addClass('d-none').removeClass('d-flex');
|
|
382
415
|
streamModal.find('iframe').removeClass('d-none');
|
|
383
416
|
};
|
|
384
417
|
|
|
385
418
|
let setStreamVideo = function (roomName) {
|
|
419
|
+
// Update stream modal iframe:
|
|
420
|
+
// Show stream with start/pause/end message (for given room) and keep updated
|
|
386
421
|
let timeNow = time();
|
|
387
422
|
|
|
388
423
|
let talksHere = data.talks[roomName];
|
|
@@ -395,7 +430,7 @@ window.conference.live = (function() {
|
|
|
395
430
|
|
|
396
431
|
// Conference not yet started
|
|
397
432
|
if (timeNow < roomStart - streamPrepend*60) {
|
|
398
|
-
|
|
433
|
+
setStreamIframeContent('{{ site.data.lang[site.conference.lang].live.pre_stream | default: "Live stream has not started yet." }}');
|
|
399
434
|
|
|
400
435
|
if (!freezeTime) {
|
|
401
436
|
streamVideoTimer = setTimeout(setStreamVideo, delayStart(roomStart - streamPrepend*60) * 1000, roomName);
|
|
@@ -404,7 +439,7 @@ window.conference.live = (function() {
|
|
|
404
439
|
|
|
405
440
|
// Conference is over
|
|
406
441
|
else if (timeNow > roomEnd + streamExtend*60) {
|
|
407
|
-
|
|
442
|
+
setStreamIframeContent('{{ site.data.lang[site.conference.lang].live.post_stream | default: "Live stream has ended." }}');
|
|
408
443
|
|
|
409
444
|
if (!freezeTime && demo) {
|
|
410
445
|
streamVideoTimer = setTimeout(setStreamVideo, delayStart(roomEnd - streamPrepend*60) * 1000, roomName);
|
|
@@ -417,7 +452,7 @@ window.conference.live = (function() {
|
|
|
417
452
|
|
|
418
453
|
// Currently stream is paused
|
|
419
454
|
if (pauseNext && timeNow >= pauseNext.start + streamExtend*60 && timeNow <= pauseNext.end - streamPrepend*60) {
|
|
420
|
-
|
|
455
|
+
setStreamIframeContent('{{ site.data.lang[site.conference.lang].live.pause_stream | default: "Live stream is currently paused." }}');
|
|
421
456
|
|
|
422
457
|
if (!freezeTime) {
|
|
423
458
|
streamVideoTimer = setTimeout(setStreamVideo, delayStart(pauseNext.end - streamPrepend*60) * 1000, roomName);
|
|
@@ -426,7 +461,7 @@ window.conference.live = (function() {
|
|
|
426
461
|
// Currently a talk is active
|
|
427
462
|
else {
|
|
428
463
|
let room = getRoom(roomName);
|
|
429
|
-
|
|
464
|
+
setStreamIframeSrc(room.href);
|
|
430
465
|
|
|
431
466
|
if (!freezeTime) {
|
|
432
467
|
if (pauseNext) {
|
|
@@ -441,6 +476,8 @@ window.conference.live = (function() {
|
|
|
441
476
|
};
|
|
442
477
|
|
|
443
478
|
let setStreamInfo = function (roomName) {
|
|
479
|
+
// Update stream modal info bar:
|
|
480
|
+
// Show next talk and speaker (for given room) and keep updated
|
|
444
481
|
let timeNow = time();
|
|
445
482
|
let talkNext = getNextTalk(roomName);
|
|
446
483
|
|
|
@@ -495,6 +532,7 @@ window.conference.live = (function() {
|
|
|
495
532
|
};
|
|
496
533
|
|
|
497
534
|
let setStream = function (roomName) {
|
|
535
|
+
// Update stream modal (iframe and info bar) for given room
|
|
498
536
|
streamModal.find('.modal-footer .btn').removeClass('active');
|
|
499
537
|
streamModal.find('#stream-select').val(0);
|
|
500
538
|
|
|
@@ -510,6 +548,7 @@ window.conference.live = (function() {
|
|
|
510
548
|
};
|
|
511
549
|
|
|
512
550
|
let updateStream = function () {
|
|
551
|
+
// Update stream modal for currently active room button
|
|
513
552
|
if (streamModal.hasClass('show')) {
|
|
514
553
|
let activeButton = streamModal.find('.modal-footer .btn.active');
|
|
515
554
|
let roomName = activeButton.data('room');
|
|
@@ -521,6 +560,7 @@ window.conference.live = (function() {
|
|
|
521
560
|
};
|
|
522
561
|
|
|
523
562
|
let stopUpdateStream = function () {
|
|
563
|
+
// Stop stream modal update timer
|
|
524
564
|
if (typeof streamVideoTimer !== "undefined") {
|
|
525
565
|
clearInterval(streamVideoTimer);
|
|
526
566
|
}
|
|
@@ -529,13 +569,15 @@ window.conference.live = (function() {
|
|
|
529
569
|
}
|
|
530
570
|
};
|
|
531
571
|
|
|
532
|
-
let hideModal = function (
|
|
572
|
+
let hideModal = function () {
|
|
573
|
+
// Close stream modal
|
|
533
574
|
streamModal.find('iframe').attr('src', '');
|
|
534
575
|
streamModal.find('.modal-footer .btn').removeClass('active');
|
|
535
576
|
streamModal.find('#stream-select').selectedIndex = -1;
|
|
536
577
|
};
|
|
537
578
|
|
|
538
579
|
let setupStream = function () {
|
|
580
|
+
// Setup events when modal opens/closes
|
|
539
581
|
streamModal = $('#stream-modal');
|
|
540
582
|
|
|
541
583
|
// configure modal opening buttons
|
|
@@ -544,8 +586,8 @@ window.conference.live = (function() {
|
|
|
544
586
|
let roomName = button.data('room');
|
|
545
587
|
setStream(roomName);
|
|
546
588
|
});
|
|
547
|
-
streamModal.on('hide.bs.modal', function (
|
|
548
|
-
hideModal(
|
|
589
|
+
streamModal.on('hide.bs.modal', function () {
|
|
590
|
+
hideModal();
|
|
549
591
|
});
|
|
550
592
|
|
|
551
593
|
// configure room selection buttons in modal
|
|
@@ -51,7 +51,7 @@ window.conference.modal = (function () {
|
|
|
51
51
|
}
|
|
52
52
|
};
|
|
53
53
|
|
|
54
|
-
let hide = function (el
|
|
54
|
+
let hide = function (el) {
|
|
55
55
|
let modal = $(el);
|
|
56
56
|
|
|
57
57
|
modal.find('.modal-title h3').text('');
|
|
@@ -61,13 +61,13 @@ window.conference.modal = (function () {
|
|
|
61
61
|
};
|
|
62
62
|
|
|
63
63
|
let init = function() {
|
|
64
|
-
elSel = '#link-modal';
|
|
64
|
+
let elSel = '#link-modal';
|
|
65
65
|
|
|
66
66
|
$(elSel).on('show.bs.modal', function (event) {
|
|
67
67
|
show(this, event);
|
|
68
68
|
});
|
|
69
|
-
$(elSel).on('hide.bs.modal', function (
|
|
70
|
-
hide(this
|
|
69
|
+
$(elSel).on('hide.bs.modal', function () {
|
|
70
|
+
hide(this);
|
|
71
71
|
});
|
|
72
72
|
};
|
|
73
73
|
|
|
@@ -34,7 +34,7 @@ window.conference.program = (function() {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
// Add current selected day as hash to URL while keeping current scrolling position
|
|
37
|
-
$('a[data-toggle="tab"]').on('shown.bs.tab', function (
|
|
37
|
+
$('a[data-toggle="tab"]').on('shown.bs.tab', function () {
|
|
38
38
|
updateHash(this.hash);
|
|
39
39
|
});
|
|
40
40
|
}
|
data/_includes/js/syncscroll.js
CHANGED
|
@@ -29,7 +29,7 @@ function (exports) {
|
|
|
29
29
|
var elems = document.getElementsByClassName('syncscroll');
|
|
30
30
|
var i, j, el, found, name;
|
|
31
31
|
for (name in names) {
|
|
32
|
-
if (
|
|
32
|
+
if (Object.prototype.hasOwnProperty.call(names, name)) {
|
|
33
33
|
for (i = 0; i < names[name].length; i++) {
|
|
34
34
|
names[name][i].removeEventListener(
|
|
35
35
|
'scroll', names[name][i].syn, 0
|
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.1.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: 2021-02-
|
|
11
|
+
date: 2021-02-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: jekyll
|