-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmake-schedule.js_orig
More file actions
120 lines (97 loc) · 3.53 KB
/
make-schedule.js_orig
File metadata and controls
120 lines (97 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
const fs = require('fs'), process = require('process');
const SECOND = 1000;
const MINUTE = 60 * SECOND;
const HOUR = 60 * MINUTE;
/* TODO’s:
* Type (talk, workshop, break, etc.)
* Day change furigana (!!)
* Time zone change!!
* Title cards ...
* Prettify presentations JSON before writing it out
* Dichotomy
* Equivalent of break with forEach?
* Timer for current
* Write to presentations.dat after reformatting!
* Rename to whats-on.html */
const parseDatabase = (datafile) => {
const database = fs.readFileSync(datafile, 'utf8');
let data = [{ }];
database.split("\n").forEach((line) => {
if (line === '') {
data.unshift({ });
return;
}
const chunks = line.split(':');
const key = chunks.shift();
const value = chunks.join(':').trim();
if (key === 'slides') data[0][key] = value.split(',');
else data[0][key] = value;
});
return data.filter((entry) => {
return entry.title;
}).sort((a, b) => Date.parse(b.time) - Date.parse(a.time));
};
const formatDuration = ((duration) => {
if (duration < HOUR) {
return `${duration / MINUTE} minutes`;
};
const hours = Math.floor(duration / HOUR);
const remainder = duration - hours * HOUR;
return `${hours} hour${hours === 1 ? '' : 's'} ${remainder ? formatDuration(remainder) : ''}`
});
const formatData = (data) => {
let dataFormatted = '';
let nextTalkTime;
data.forEach((pres) => {
if (!pres.time) return;
const thisTalkTime = Date.parse(pres.time);
if (/^Break,/.test(pres.title)) {
klass = 'accordion-break';
const duration = nextTalkTime - thisTalkTime;
pres.title = `Break, ${formatDuration(duration)}`.trim();
} else {
klass = 'accordion';
}
dataFormatted = `</button>
<div class="panel">
<p>
${pres.abstract}
</p>
</div>\n\n` + dataFormatted;
if (pres.sources) {
dataFormatted = `<a href="${pres.sources}"><img src="assets/img/tgz.png" height="24" alt="Sources" /></a>\n` + dataFormatted;
}
if (pres.slides) {
pres.slides.forEach((slidesFile) => {
dataFormatted = `<a class="presLink" href="${slidesFile}"><img class="presLink" src="assets/img/Slides.png" alt="Slides" /></a>\n` + dataFormatted;
});
}
if (pres.preprint) {
dataFormatted = `<a class="pdfLink" href="${pres.preprint}"><img src="assets/img/PDF_24.png" alt="Preprint"/></a>` + dataFormatted;
}
dataFormatted = `<font class="serif">${pres.title}</font>\n` + dataFormatted;
if (pres.author) dataFormatted = `| ${pres.author} ` + dataFormatted;
dataFormatted = `<button class="${klass}" id="${pres.time}">
<span class="timeboxL" data-datetime="${pres.time}"></span>\n` + dataFormatted;
nextTalkTime = thisTalkTime;
});
console.log(data);
fs.writeFileSync('presentations.js', `const presentations = ${JSON.stringify(data, null, 2)}\n`, 'utf8');
return dataFormatted;
};
const writeout = (environment) => {
const inSchedule = fs.readFileSync('sched.html.in', 'utf8');
const outSchedule = inSchedule.replace(
'<list-of-presentations />',
formatData(parseDatabase('pres.dat')));
fs.writeFileSync('sched.html', outSchedule, 'utf8');
}
/*
const data = parseDatabase('pres.dat');
for (let i in data) { console.log('i =', i, ', data[i] =', data[i]); } // “let in data” valid??
for (let j in data) { // but “let i data” invalid :-P
const i = parseInt(j);
console.log('i = ', i, ', data[i] =', data[i], ', data[i+1] =', data[i+1]);
}
*/
writeout();