132 lines
4.1 KiB
JavaScript
132 lines
4.1 KiB
JavaScript
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");
|
|
|
|
fs.readFile("./events.xml", "utf8", (err, data) => {
|
|
if (err) {
|
|
console.error(err);
|
|
return;
|
|
}
|
|
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 (/(?<!:[0-9])[0-9] (a|A|p|P)/g.exec(timeStr)) {
|
|
timeStr = timeStr.replace(/[0-9](?= )/, "$&:00");
|
|
}
|
|
// convert from CST to EST
|
|
const OFFSET_FROM_EST = +1;
|
|
let date = new Date(`${dateStr} ${timeStr}`);
|
|
date.setHours(date.getHours() + OFFSET_FROM_EST);
|
|
return date;
|
|
};
|
|
|
|
const nodeChildrenToString = (nodeChildren) => {
|
|
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();
|
|
let currentTerm = "";
|
|
for (let i = 0; i < eventdefsChildren.length; ++i) {
|
|
// sometimes there's events that are commented out, hopefully this catches that
|
|
if (
|
|
eventdefsChildren[i].type() === "comment" &&
|
|
/((winter)|(fall)|(spring))/.exec(
|
|
eventdefsChildren[i].toString().toLowerCase()
|
|
)
|
|
) {
|
|
currentTerm = eventdefsChildren[i].text().replace(/[\\\\/:*?\"<>|]/g, "");
|
|
currentTerm = currentTerm.replace(/(\s+)/g, "-");
|
|
} else if (eventdefsChildren[i].type() === "element") {
|
|
const title = eventdefsChildren[i].attr("title").value();
|
|
const shortNodes = eventdefsChildren[i].get(".//short").childNodes();
|
|
let short = converterShowdown.makeMarkdown(
|
|
nodeChildrenToString(shortNodes)
|
|
);
|
|
// remove newlines from short
|
|
short = short.replace(/\n/g, "");
|
|
const dateStr = eventdefsChildren[i].attr("date").value();
|
|
const timeStr = eventdefsChildren[i].attr("time").value();
|
|
const date = parseTime(dateStr, timeStr);
|
|
const location = eventdefsChildren[i].attr("room").value();
|
|
const online = location.toLowerCase() === "online" ? true : false;
|
|
let abstract = short;
|
|
if (eventdefsChildren[i].get(".//abstract") !== undefined) {
|
|
const abstractNodes = eventdefsChildren[i]
|
|
.get(".//abstract")
|
|
.childNodes();
|
|
abstract = converterShowdown.makeMarkdown(
|
|
nodeChildrenToString(abstractNodes)
|
|
);
|
|
abstract = abstract.replace(/<br>/g, "\n");
|
|
}
|
|
let registerLink = "";
|
|
// detects a link in markdown such as [CSC Club Website](<http://csclub.uwaterloo.ca//>)
|
|
const markdownLinkDetectRegex = /(?<=\[(.*)\]\(<)(.*)(?=>\))/;
|
|
if (markdownLinkDetectRegex.exec(abstract)) {
|
|
registerLink = `\n registerLink: "${
|
|
markdownLinkDetectRegex.exec(abstract)[0]
|
|
}",`;
|
|
}
|
|
const mdx = `export const metadata = {
|
|
name: "${title}",
|
|
short: "${short}",
|
|
date: new Date("${date.toString()}"),
|
|
online: ${online},
|
|
location: "${location}",${registerLink}
|
|
}
|
|
|
|
${abstract}`;
|
|
|
|
// remove invalid characters from filenames
|
|
let mdxTitle = title.replace(/[\\\\/:*?\"<>|]/g, "");
|
|
mdxTitle = mdxTitle.replace(/(\s+)/g, "-");
|
|
|
|
fs.mkdir(
|
|
`./markdown-events/${currentTerm}`,
|
|
{ recursive: true },
|
|
(err) => {
|
|
if (err) throw err;
|
|
}
|
|
);
|
|
fs.writeFile(
|
|
`./markdown-events/${currentTerm}/${mdxTitle}.event.mdx`,
|
|
mdx,
|
|
(err) => {
|
|
if (err) throw err;
|
|
}
|
|
);
|
|
}
|
|
}
|
|
};
|