Last active
March 12, 2017 23:01
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==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