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) ); 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) ); } const md = `--- name: '${title.replace(/'/g, "''")}' short: '${short.replace(/\n/g, "").replace(/'/g, "''")}' date: '${date.toString().replace(/'/g, "''")}' online: ${online} location: '${location.replace(/'/g, "''")}' --- ${abstract.replace(/
/g, "\n")}`; // remove invalid characters from filenames let mdTitle = title.replace(/[\\\\/:*?\"<>|]/g, "").replace(/(\s+)/g, "-"); fs.mkdirSync( `./markdown-events/${currentTerm.year}/${currentTerm.term}`, { recursive: true }, (err) => { if (err) throw err; } ); fs.writeFileSync( `./markdown-events/${currentTerm.year}/${currentTerm.term}/${mdTitle}.md`, md, (err) => { if (err) { throw err; } } ); } }); };