2016-04-20 11:32:48 +02:00
|
|
|
var ical = require('./ical')
|
|
|
|
, request = require('request')
|
|
|
|
, fs = require('fs')
|
|
|
|
|
|
|
|
exports.fromURL = function(url, opts, cb){
|
|
|
|
if (!cb)
|
|
|
|
return;
|
|
|
|
request(url, opts, function(err, r, data){
|
|
|
|
if (err)
|
|
|
|
return cb(err, null);
|
|
|
|
cb(undefined, ical.parseICS(data));
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.parseFile = function(filename){
|
|
|
|
return ical.parseICS(fs.readFileSync(filename, 'utf8'))
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-01-14 19:31:24 +01:00
|
|
|
var rrule = require('rrule-alt').RRule
|
2017-01-21 16:05:29 +01:00
|
|
|
var rrulestr = rrule.rrulestr
|
2016-04-20 11:32:48 +02:00
|
|
|
|
|
|
|
ical.objectHandlers['RRULE'] = function(val, params, curr, stack, line){
|
|
|
|
curr.rrule = line;
|
|
|
|
return curr
|
|
|
|
}
|
|
|
|
var originalEnd = ical.objectHandlers['END'];
|
|
|
|
ical.objectHandlers['END'] = function(val, params, curr, stack){
|
|
|
|
if (curr.rrule) {
|
2017-01-21 16:05:29 +01:00
|
|
|
var rule = curr.rrule;
|
2016-04-20 11:32:48 +02:00
|
|
|
if (rule.indexOf('DTSTART') === -1) {
|
2016-04-23 17:20:58 +02:00
|
|
|
|
|
|
|
if (curr.start.length === 8) {
|
|
|
|
var comps = /^(\d{4})(\d{2})(\d{2})$/.exec(curr.start);
|
|
|
|
if (comps) {
|
2016-05-03 11:56:24 +02:00
|
|
|
curr.start = new Date (comps[1], comps[2] - 1, comps[3]);
|
2016-04-23 17:20:58 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-09 17:46:48 +02:00
|
|
|
if( typeof (curr.start) === "date") {
|
|
|
|
rule += ' DTSTART:' + curr.start.toISOString().replace(/[-:]/g, '');
|
|
|
|
rule = rule.replace(/\.[0-9]{3}/, '');
|
|
|
|
}
|
2016-04-20 11:32:48 +02:00
|
|
|
}
|
2017-01-21 16:05:29 +01:00
|
|
|
for (var i in curr.exdates) {
|
2019-06-11 23:24:03 +02:00
|
|
|
if( typeof (curr.exdates[i]) === "date") {
|
|
|
|
rule += ' EXDATE:' + curr.exdates[i].toISOString().replace(/[-:]/g, '');
|
|
|
|
rule = rule.replace(/\.[0-9]{3}/, '');
|
|
|
|
}
|
2017-01-21 16:05:29 +01:00
|
|
|
}
|
2018-11-07 18:44:32 +00:00
|
|
|
try {
|
|
|
|
curr.rrule = rrulestr(rule);
|
|
|
|
}
|
|
|
|
catch(err) {
|
|
|
|
console.log("Unrecognised element in calendar feed, ignoring: " + rule);
|
|
|
|
curr.rrule = null;
|
|
|
|
}
|
2016-04-20 11:32:48 +02:00
|
|
|
}
|
|
|
|
return originalEnd.call(this, val, params, curr, stack);
|
|
|
|
}
|