From c36f8019b1c91ea25a853f25e956061d298d7e57 Mon Sep 17 00:00:00 2001 From: Yorick van Pelt Date: Sun, 5 Nov 2017 00:47:06 +0100 Subject: [PATCH] work. --- index.js | 65 ++++++++++++++++++++++++++++++++++++++++++++-------- package.json | 5 ++-- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/index.js b/index.js index 18258d9..1c24de1 100644 --- a/index.js +++ b/index.js @@ -1,11 +1,58 @@ -var request = require('request'); -var cheerio = require('cheerio'); +"use strict" +const cheerio = require('cheerio'); +const ical = require('ical-generator') +const rp = require('request-promise'); -request('http://www.ru.nl/radboudreflects/agenda/aankomende-verdiepende-lezingen-debatten-iedereen/', function (error, response, html) { - if (!error && response.statusCode == 200) { - const $ = cheerio.load(html); - Array.from($(".ipx-pt-evenement.type-entry")).forEach(evt => { - +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: `${values.get('type')} by ${values.get('spreker')} +${pprint_map(values)}`, + }) + cal_evt.htmlDescription(`${values.get('type')} by ${values.get('spreker')} +${pprint_map(values)}`) }) - } -}); \ No newline at end of file + console.log(cal.toString()) + }) diff --git a/package.json b/package.json index 994d2bd..c09e251 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,9 @@ "main": "index.js", "dependencies": { "cheerio": "^1.0.0-rc.1", - "ical-generator": "^0.2.9", - "request": "^2.81.0" + "ical-generator": "^0.2.10", + "request": "^2.81.0", + "request-promise": "^4.2.2" }, "devDependencies": {}, "scripts": {