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

112 lines
3.7 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 xmlJs = require("xml-js");
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, title, currentTerm) => {
if (/-/.exec(timeStr)) {
console.error(`${title}, ${currentTerm} has a date range: ${timeStr}`);
return;
}
// 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 parseXML = (XML) => {
const js = xmlJs.xml2js(XML);
let currentTerm = "";
for (let i = 0; i < js.elements[0].elements.length; ++i) {
if (js.elements[0].elements[i].type === "comment") {
// sometimes there's events that are commented out, hopefully this catches that
if (
/(winter)|(fall)|(spring)/.exec(
js.elements[0].elements[i].comment.toLowerCase()
)
) {
currentTerm = js.elements[0].elements[i].comment.replace(
/(\s+|:+)/g,
"-"
);
}
} else if (js.elements[0].elements[i].type === "element") {
const title = js.elements[0].elements[i].attributes.title;
let short = converterShowdown.makeMarkdown(
xmlJs.js2xml(js.elements[0].elements[i].elements[0])
);
// remove newlines from short
short = short.replace(/\n/g, "");
const dateStr = js.elements[0].elements[i].attributes.date;
const timeStr = js.elements[0].elements[i].attributes.time;
const date = parseTime(dateStr, timeStr, title, currentTerm);
const location = js.elements[0].elements[i].attributes.room;
const online = location.toLowerCase() === "online" ? true : false;
let abstract = "undefined";
if (js.elements[0].elements[i].elements[1] === undefined) {
console.error(`${title}, ${currentTerm} has no abstract`);
} else {
abstract = converterShowdown.makeMarkdown(
xmlJs.js2xml(js.elements[0].elements[i].elements[1])
);
}
let registerLink = "";
// detects a link in markdown such as [CSC Club Website](<http://csclub.uwaterloo.ca//>)
const markdownLinkDetectRegex = /(?<=\[(.*)\]\(<)(.*)(?=>\))/;
if (markdownLinkDetectRegex.exec(abstract)) {
registerLink = markdownLinkDetectRegex.exec(abstract)[0];
} else {
registerLink = "no link";
}
const mdx = `export const metadata = {\n name: "${title}",\n short: "${short}",\n date: "${date}",\n online: ${online},\n location: "${location}",\n registerLink: "${registerLink}"\n}\n\n${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}.mdx`,
mdx,
(err) => {
if (err) throw err;
}
);
}
}
};