old-website/scripts/mdx-scripts/event-conversion.js

132 lines
4.1 KiB
JavaScript
Raw Normal View History

2021-06-03 18:10:05 -04:00
const fs = require("fs");
2021-06-04 17:24:56 -04:00
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
2021-06-13 12:26:10 -04:00
const { window } = new JSDOM("");
global.window = window;
2021-06-04 17:24:56 -04:00
var showdown = require("showdown");
const converterShowdown = new showdown.Converter();
2021-06-14 13:29:36 -04:00
const libxmljs = require("libxmljs");
2021-06-04 17:24:56 -04:00
2021-06-14 01:00:44 -04:00
fs.readFile("./events.xml", "utf8", (err, data) => {
2021-06-03 18:10:05 -04:00
if (err) {
console.error(err);
return;
}
parseXML(data);
2021-06-03 18:10:05 -04:00
});
2021-06-03 08:35:58 -04:00
2021-06-13 21:28:12 -04:00
fs.mkdir("./markdown-events/", { recursive: true }, (err) => {
if (err) throw err;
});
2021-06-14 13:29:36 -04:00
const parseTime = (dateStr, timeStr) => {
// if timeStr is a range (ex. 7pm - 9pm) we take the first time (ex. 7pm)
2021-06-13 13:46:05 -04:00
if (/-/.exec(timeStr)) {
2021-06-14 13:29:36 -04:00
timeStr = timeStr.split("-")[0];
2021-06-13 13:46:05 -04:00
}
// 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;
};
2021-06-14 13:29:36 -04:00
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;
};
2021-06-03 08:35:58 -04:00
const parseXML = (XML) => {
2021-06-14 13:29:36 -04:00
const xmlDoc = libxmljs.parseHtml(XML);
let eventdefsChildren = xmlDoc.get("//eventdefs").childNodes();
2021-06-13 21:28:12 -04:00
let currentTerm = "";
2021-06-14 13:29:36 -04:00
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()
)
) {
2021-06-14 13:42:52 -04:00
currentTerm = eventdefsChildren[i].text().replace(/[\\\\/:*?\"<>|]/g, "");
currentTerm = currentTerm.replace(/(\s+)/g, "-");
2021-06-14 13:29:36 -04:00
} else if (eventdefsChildren[i].type() === "element") {
const title = eventdefsChildren[i].attr("title").value();
const shortNodes = eventdefsChildren[i].get(".//short").childNodes();
2021-06-13 21:28:12 -04:00
let short = converterShowdown.makeMarkdown(
2021-06-14 13:29:36 -04:00
nodeChildrenToString(shortNodes)
2021-06-13 21:28:12 -04:00
);
// remove newlines from short
short = short.replace(/\n/g, "");
2021-06-14 13:29:36 -04:00
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();
2021-06-13 21:28:12 -04:00
const online = location.toLowerCase() === "online" ? true : false;
2021-06-14 13:29:36 -04:00
let abstract = short;
if (eventdefsChildren[i].get(".//abstract") !== undefined) {
const abstractNodes = eventdefsChildren[i]
.get(".//abstract")
.childNodes();
2021-06-13 21:28:12 -04:00
abstract = converterShowdown.makeMarkdown(
2021-06-14 13:29:36 -04:00
nodeChildrenToString(abstractNodes)
2021-06-13 21:28:12 -04:00
);
2021-06-14 00:56:31 -04:00
abstract = abstract.replace(/<br>/g, "\n");
2021-06-13 21:28:12 -04:00
}
2021-06-14 13:29:36 -04:00
let registerLink = "";
2021-06-13 21:28:12 -04:00
// detects a link in markdown such as [CSC Club Website](<http://csclub.uwaterloo.ca//>)
const markdownLinkDetectRegex = /(?<=\[(.*)\]\(<)(.*)(?=>\))/;
if (markdownLinkDetectRegex.exec(abstract)) {
2021-06-14 13:29:36 -04:00
registerLink = `\n registerLink: "${
markdownLinkDetectRegex.exec(abstract)[0]
}",`;
2021-06-13 21:28:12 -04:00
}
2021-06-14 14:31:36 -04:00
const mdx = `export const metadata = {
2021-06-14 00:56:31 -04:00
name: "${title}",
short: "${short}",
date: new Date("${date.toString()}"),
online: ${online},
2021-06-14 13:29:36 -04:00
location: "${location}",${registerLink}
2021-06-14 00:56:31 -04:00
}
2021-06-13 13:46:05 -04:00
2021-06-14 00:56:31 -04:00
${abstract}`;
2021-06-14 13:29:36 -04:00
2021-06-13 21:28:12 -04:00
// remove invalid characters from filenames
let mdxTitle = title.replace(/[\\\\/:*?\"<>|]/g, "");
mdxTitle = mdxTitle.replace(/(\s+)/g, "-");
2021-06-03 18:10:05 -04:00
2021-06-13 21:28:12 -04:00
fs.mkdir(
`./markdown-events/${currentTerm}`,
{ recursive: true },
(err) => {
if (err) throw err;
}
);
fs.writeFile(
2021-06-14 00:56:31 -04:00
`./markdown-events/${currentTerm}/${mdxTitle}.event.mdx`,
2021-06-13 21:28:12 -04:00
mdx,
(err) => {
if (err) throw err;
}
);
}
2021-06-03 08:35:58 -04:00
}
2021-06-03 18:20:03 -04:00
};