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

80 lines
2.6 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");
const useShowdown = (HTML) => {
return converterShowdown.makeMarkdown(HTML);
};
fs.readFile("./event-test.xml", "utf8", (err, data) => {
if (err) {
console.error(err);
return;
}
parseXML(data);
});
const parseTime = (dateStr, timeStr) => {
if (/-/.exec(timeStr)) {
console.error(`${timeStr} has date a range`);
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);
for (let i = 0; i < js.elements[0].elements.length; ++i) {
const title = js.elements[0].elements[i].attributes.title;
let short = useShowdown(
xmlJs.js2xml(js.elements[0].elements[i].elements[0])
);
// remove trailing newlines from short
short = short.replace(/\n+$/, "");
const dateStr = js.elements[0].elements[i].attributes.date;
const timeStr = js.elements[0].elements[i].attributes.time;
const date = parseTime(dateStr, timeStr);
const location = js.elements[0].elements[i].attributes.room;
const online = location.toLowerCase() === "online" ? true : false;
const abstract = useShowdown(
xmlJs.js2xml(js.elements[0].elements[i].elements[1])
);
let registerLink = "";
// detects a link in markdown
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}`;
const mdxTitle = title.replace(/(\s+|:+)/g, "-");
fs.writeFile(`./markdown-events/${mdxTitle}.mdx`, mdx, function (err) {
if (err) return console.log(err);
});
}
};