const jsdom = require("jsdom"); const { JSDOM } = jsdom;
const request = require("request");
const http = require("http");
const MONTH_MAP = {
"januari": "1",
"februari": "2",
"mars": "3",
"april": "4",
"maj": "5",
"juni": "6",
"juli": "7",
"augusti": "8",
"september": "9",
"oktober": "10",
"november": "11",
"december": "12"
};
class Temadag {
constructor(name, year, month, day) {
this.name = name;
this.year = year;
this.month = month;
this.day = day;
}
get icalArray() {
return [
"BEGIN:VEVENT",
`SUMMARY:${this.name}`,
`DTSTART;VALUE=DATE:${this.year}${this.month.padStart(2, "0")}${this.day.padStart(2, "0")}`,
"END:VEVENT"
];
}
};
function getIcal(temadagar) {
let ical = [
"BEGIN:VCALENDAR",
"VERSION:2.0",
"PRODID:-//LemonIllusion//Temadagar.se ICAL//SV"
];
for (let temadag of temadagar) {
ical = ical.concat(temadag.icalArray);
}
ical = ical.concat([
"END:VCALENDAR"
]);
return ical.join("\r\n");
}
function getTemadagar(sendResponse) {
console.log("Constructing response");
request({
url: "https://temadagar.se/kalender/",
headers: {
"User-Agent": "request"
}
}, function(error, response, body) {
const { document } = (new JSDOM(body)).window;
let temadagar = [];
for (let yearh3 of document.querySelectorAll(".content h3")) {
let year = yearh3.innerHTML.match(/\d+/)[0];
for (let dayb of yearh3.nextElementSibling.querySelectorAll("b")) {
let match;
if (match = dayb.innerHTML.match(/^(\d{1,2})\s([A-z]+)$/)) {
let day = match[1];
let month = MONTH_MAP[match[2].toLowerCase()];
for (let nameEl = dayb.nextSibling.nextSibling; nameEl.nodeName !== "BR"; nameEl = nameEl.nextSibling.nextSibling) {
let name;
if (nameEl.nodeName === "A") {
name = nameEl.innerHTML;
} else {
name = nameEl.textContent;
}
name = name.replace("*", "");
temadagar.push(new Temadag(name, year, month, day));
}
}
}
}
console.log("Sending response");
sendResponse(getIcal(temadagar));
});
}
http.createServer(function(request, response){
console.log("Request recieved");
response.writeHead(200, {"Content-Type": "text/calendar"});
getTemadagar(function(ical){response.end(ical)}.bind(this));
}).listen(80);