Skip to content

Instantly share code, notes, and snippets.

@jelmervdl
Last active March 12, 2017 23:01
Show Gist options
  • Save jelmervdl/5585160 to your computer and use it in GitHub Desktop.
Save jelmervdl/5585160 to your computer and use it in GitHub Desktop.
Add 'GCal' link to all the dates in the the programme on the de Oosterpoort website.
// ==UserScript==
// @name GCal links for De Oosterpoort
// @namespace http://ikhoefgeen.nl/userscripts
// @description Create Google Calendar events directly from De Oosterpoort website
// @include http://www.de-oosterpoort.nl/programma/*
// ==/UserScript==
var DeOosterpoort = {}
DeOosterpoort.findData = function(root)
{
var header = root.querySelector('#main h1'),
specs = root.querySelectorAll("#main .detail-info table tr"),
event = new iCal.Event;
if (!header || specs.length == 0)
return null;
event.name = getText(header);
for (var i = 0; i < specs.length; ++i)
{
// If it doesn't have at least two table data fields, skip it.
if (!specs[i].querySelector('td + td'))
continue;
var label = specs[i].querySelector('td').textContent.trim(),
value = (specs[i].querySelector('td + td > span')
? specs[i].querySelector('td + td > span')
: specs[i].querySelector('td + td')).textContent.trim();
switch (label)
{
case 'Datum':
DeOosterpoort.parseDatum(value, event);
break;
case 'Tijdstip':
DeOosterpoort.parseTijdstip(value, event);
break;
case 'Locatie':
event.location = value;
break;
}
}
console.log(event);
return event;
};
DeOosterpoort.parseDatum = function(datum, event)
{
var parts = datum.match(/^\w+\ (\d+) (\w+) (\d+)$/);
if (!parts)
throw "Could not parse string '" + datum + "' as a date.";
var month = [
'januari', 'februari', 'maart',
'april', 'mei', 'juni',
'juli', 'augustus', 'september',
'oktober', 'november', 'december'
].indexOf(parts[2]);
['from', 'till'].forEach(function(range) {
event[range].setYear(parts[3]);
event[range].setMonth(month);
event[range].setDate(parts[1]);
});
return true;
};
DeOosterpoort.parseTijdstip = function(tijdstip, event)
{
var parts = tijdstip.match(/^(\d{1,2}):(\d\d)(?:\s+tot (\d{1,2}):(\d\d))?$/);
if (!parts)
throw "Could not parse '" + tijdstip + "' as a time.";
event.from.setHours(parts[1]);
event.from.setMinutes(parts[2]);
if (typeof parts[3] !== 'undefined' && typeof parts[4] !== 'undefined')
{
event.till.setHours(parts[3]);
event.till.setMinutes(parts[4]);
}
else
{
event.till.setHours(parseInt(parts[1]) + 1);
event.till.setMinutes(parts[2]);
}
return true;
}
function align(length, filler, value)
{
value = "" + value; // now it is a string for sure! :P
return repeat(filler, length - value.length) + value;
}
function repeat(character, times)
{
var output = '';
while (times-- > 0)
output += character;
return output;
}
function getText(node)
{
return node.textContent.replace(/\s+/gm, ' ').trim();
}
var iCal = {};
iCal.Event = function() {
this.from = new Date;
this.till = new Date;
this.name = '[name]';
this.location = '[location]';
this.link = document.location.href;
}
iCal.Event.prototype.toGoogleCalendarLink = function()
{
var ical_format = 'Ymd\THis\Z';
return [
'http://www.google.com/calendar/event?action=TEMPLATE',
'text=' + encodeURIComponent(this.name),
'dates=' + iCal.formatDate(ical_format, this.from) + '/' + iCal.formatDate(ical_format, this.till),
'location=' + encodeURIComponent(this.location),
'details=' + encodeURIComponent(this.link),
'trp=true',
'sprop=De+Oosterpoort',
'sprop=name:' + encodeURIComponent(this.link)
].join("&");
}
iCal.formatDate = function(format, date)
{
var output = '';
for (var i = 0; i < format.length; ++i)
{
switch (format[i])
{
case '\\':
output += format[++i];
break;
case 'Y':
output += date.getUTCFullYear();
break;
case 'm':
output += align(2, '0', date.getUTCMonth() + 1);
break;
case 'd':
output += align(2, '0', date.getUTCDate());
break;
case 'H':
output += align(2, '0', date.getUTCHours());
break;
case 'i':
output += align(2, '0', date.getUTCMinutes());
break;
case 's':
output += align(2, '0', date.getUTCSeconds());
break;
default:
output += format[i];
break;
}
}
return output;
}
function main()
{
var event = DeOosterpoort.findData(document);
if (!event)
return;
var lookup_link = document.createElement('a');
lookup_link.style.fontSize = '0.8em';
lookup_link.style.marginLeft = '1ch';
lookup_link.href = 'https://www.google.com/calendar/render?tab=mc&date=' + iCal.formatDate('Ymd', event.from);
lookup_link.target = '_blank';
lookup_link.appendChild(document.createTextNode('show in GCal'));
document.querySelector('#main .detail-info td+td').appendChild(lookup_link);
var link = document.createElement('a');
link.style.float = 'right';
link.style.fontSize = '0.8em';
link.href = event.toGoogleCalendarLink();
link.target = '_blank';
link.appendChild(document.createTextNode('Add to GCal'));
document.querySelector('#main .detail-info td+td').appendChild(link);
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment