80 lines
2.6 KiB
JavaScript
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);
|
|
});
|
|
}
|
|
};
|