const fs = require("fs"); const jsdom = require("jsdom"); const { JSDOM } = jsdom; const { window } = new JSDOM(""); global.window = window; var showdown = require("showdown"); const converterShowdown = new showdown.Converter(); const libxmljs = require("libxmljs"); const getTerm = require("./getTerm.js"); fs.readFile("../../events.xml", "utf8", (err, data) => { if (err) { console.error(err); return; } data = data.replace(//, ""); parseXML(data); }); fs.mkdir("./markdown-events/", { recursive: true }, (err) => { if (err) throw err; }); const parseTime = (dateStr, timeStr) => { // if timeStr is a range (ex. 7pm - 9pm) we take the first time (ex. 7pm) if (/-/.exec(timeStr)) { timeStr = timeStr.split("-")[0]; } // converting cases like 7pm to 7PM timeStr = timeStr.toUpperCase(); // converting cases like 7PM to 7 PM if (/[0-9](a|A|p|P)/g.exec(timeStr)) { timeStr = timeStr.replace(/[0-9](?=(a|A|p|P))/g, "$& "); } // converting cases like 7 PM to 7:00 PM if (/(? { let string = ""; for (let i = 0; i < nodeChildren.length; ++i) { if (nodeChildren[i].type() === "text") { string += nodeChildren[i]; } else { string += nodeChildren[i].toString(); } } return string; }; const parseXML = (XML) => { const xmlDoc = libxmljs.parseHtml(XML); let eventdefsChildren = xmlDoc.get("//eventdefs").childNodes(); eventdefsChildren.forEach((eventItem) => {`` if (eventItem.type() === "element") { const title = eventItem.attr("title").value(); const shortNodes = eventItem.get(".//short").childNodes(); let short = converterShowdown.makeMarkdown( nodeChildrenToString(shortNodes) ); // remove newlines from short short = short.replace(/\n/g, ""); const dateStr = eventItem.attr("date").value(); const timeStr = eventItem.attr("time").value(); const date = parseTime(dateStr, timeStr); currentTerm = getTerm(date); const location = eventItem.attr("room").value(); const online = location.toLowerCase() === "online" ? true : false; let abstract = short; if (eventItem.get(".//abstract") !== undefined) { const abstractNodes = eventItem.get(".//abstract").childNodes(); abstract = converterShowdown.makeMarkdown( nodeChildrenToString(abstractNodes) ); abstract = abstract.replace(/
/g, "\n"); } const md = `--- name: "${title}", short: "${short}", date: new Date("${date.toString()}"), online: ${online}, location: "${location}", --- ${abstract}`; // remove invalid characters from filenames let mdTitle = title.replace(/[\\\\/:*?\"<>|]/g, ""); mdTitle = mdTitle.replace(/(\s+)/g, "-"); fs.mkdir( `./markdown-events/${currentTerm}`, { recursive: true }, (err) => { if (err) throw err; } ); fs.writeFile( `./markdown-events/${currentTerm}/${mdTitle}.event.md`, md, (err) => { if (err) throw err; } ); } }); };