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-13 12:26:10 -04:00
|
|
|
const xmlJs = require("xml-js");
|
2021-06-04 17:24:56 -04:00
|
|
|
|
2021-06-13 21:28:12 -04:00
|
|
|
fs.readFile("./events.xml", "utf8", (err, data) => {
|
2021-06-03 18:10:05 -04:00
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
return;
|
|
|
|
}
|
2021-06-13 22:40:44 -04:00
|
|
|
parseXML(data);c
|
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;
|
|
|
|
});
|
|
|
|
|
|
|
|
const parseTime = (dateStr, timeStr, title, currentTerm) => {
|
2021-06-13 13:46:05 -04:00
|
|
|
if (/-/.exec(timeStr)) {
|
2021-06-13 22:40:44 -04:00
|
|
|
// timeStr = timeStr.split("-")[0];
|
2021-06-13 21:28:12 -04:00
|
|
|
console.error(`${title}, ${currentTerm} has a date range: ${timeStr}`);
|
2021-06-13 13:46:05 -04:00
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
2021-06-03 08:35:58 -04:00
|
|
|
const parseXML = (XML) => {
|
2021-06-13 12:26:10 -04:00
|
|
|
const js = xmlJs.xml2js(XML);
|
2021-06-13 21:28:12 -04:00
|
|
|
let currentTerm = "";
|
2021-06-13 12:26:10 -04:00
|
|
|
for (let i = 0; i < js.elements[0].elements.length; ++i) {
|
2021-06-13 21:28:12 -04:00
|
|
|
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";
|
|
|
|
}
|
2021-06-13 13:46:05 -04:00
|
|
|
|
2021-06-13 22:40:44 -04:00
|
|
|
const mdx = `export const metadata = {
|
|
|
|
name: "${title}",
|
|
|
|
short: "${short}",
|
|
|
|
date: new Date("${date.toISOString()}"),
|
|
|
|
online: ${online},
|
|
|
|
location: "${location}",
|
|
|
|
registerLink: "${registerLink}"
|
|
|
|
}
|
|
|
|
|
|
|
|
${abstract}`;
|
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(
|
|
|
|
`./markdown-events/${currentTerm}/${mdxTitle}.mdx`,
|
|
|
|
mdx,
|
|
|
|
(err) => {
|
|
|
|
if (err) throw err;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
2021-06-03 08:35:58 -04:00
|
|
|
}
|
2021-06-03 18:20:03 -04:00
|
|
|
};
|