reflects-ical/index.js

59 lines
2.2 KiB
JavaScript

"use strict"
const cheerio = require('cheerio');
const ical = require('ical-generator')
const rp = require('request-promise');
function translate_date(datestr) {
// 13 januari 2013 -> 2013,0,13
let [d,m,y] = datestr.split(' ')
d = +d; y = +y
m = "januari februari maart april mei juni juli augustus september oktober november december".split(' ').indexOf(m.toLowerCase())
return new Date(y, m, d)
}
function pprint_map(x) {
return Array.from(x.entries()).map(([k,v]) => `${k}: ${v}`).join('\n')
}
rp({uri: 'http://www.ru.nl/radboudreflects/agenda/openbare-lezingen/',
transform: cheerio.load.bind(cheerio)
})
.then(($) =>
Array.from($(".ipx-pt-evenement.type-entry")).map(evt => {
const title = $('h2', evt).text()
const url = $('h2 > a', evt).attr('href')
const fromDT = sel => new Map(Array.from(sel).map(x => [$(x).attr('class').split(' ')[1], $(x).text().trim()]))
const labels = fromDT($('dt.label', evt))
const values = fromDT($('dd.value', evt))
const uid = $(evt).attr('data-ipx-id')
//console.log(uid, values)
return ({labels, values, uid, title, url})
})
)
.then(events => {
const cal = ical({
domain: 'pub.yori.cc',
name: "Radboud Reflects Lezingen",
url: "https://pub.yori.cc/reflects.ical",
timezone: "Europe/Amsterdam",
})
events.forEach(event => {
const {values, url, title, uid} = event
const [stime, etime] = values.get('starttijd').split(' t/m ').map(x => x.split(':').map(y=>+y))
const start = translate_date(values.get('startdatum'))
start.setHours(...stime)
const end = new Date(start)
end.setHours(...etime)
if (end < start) end.setDate(end.getDate()+1)
const cal_evt = cal.createEvent({
summary: title,
uid, start, end, url,
location: values.get('locatie'),
description: `<a href="${url}">${values.get('type')} by ${values.get('spreker')}</a>
${pprint_map(values)}`,
})
cal_evt.htmlDescription(`<a href="${url}">${values.get('type')} by ${values.get('spreker')}</a>
${pprint_map(values)}`)
})
console.log(cal.toString())
})