const http = require('http') const ical = require('ical') function createEventEntry (event) { const entry = document.createElement('div') const formatDate = Intl.DateTimeFormat('fr', { dateStyle: 'long', timeStyle: 'short' }).format const header = document.createElement('h3') header.textContent = formatDate(event.date) + ' | ' + event.summary entry.className = 'event-entry' entry.setAttribute('entry-time', event.date.getTime()) entry.appendChild(header) return entry } function sortEvents (events) { const sorted = [] /* First extract the events. */ Object.values(events).forEach(event => { if (event.type === 'VEVENT') { sorted.push({ date: event.start, location: event.location, summary: event.summary }) } }) /* Then sort them out. */ // TODO: Useless here. Should be done on callbacks below return sorted.sort((a, b) => { return a.date < b.date }) } function loadEvents (cb) { http.request({ // host: 'www.ti-nuage.fr', host: 'test-www.ti-nuage.fr', path: '/donnees/calendrier.php' }, function (response) { let str = '' response.on('data', function (chunk) { str += chunk }) response.on('end', function () { const events = sortEvents(ical.parseICS(str)) cb(events) }) }).end() } module.exports = { fill: function (target) { loadEvents(events => { events.forEach(event => { target.appendChild(createEventEntry(event)) }) }) }, mergeWithNews: function (target) { const blogEntries = target.getElementsByClassName('blog-entry') const entries = {} for (let i = 0; i < blogEntries.length; ++i) { const item = blogEntries.item(i) entries[item.getAttribute('entry-time')] = item } loadEvents(events => { target.innerHTML = '' /* Merge events with blog entries */ events.forEach(event => { entries[event.date.getTime()] = createEventEntry(event) }) /* Sort and only keep entries up to the next 30 days */ const limitTime = Date.now() + (30 * 24 * 60 * 60 * 1000) const times = Object.keys(entries).sort(function (a, b) { return a < b }) for (let i = times.length; i--;) { if (times[i] > limitTime) { times.splice(i, 1) } } /* Finally display only the first six entries */ times.splice(5, times.length) times.forEach(time => { target.appendChild(entries[time]) }) }) } }