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

80 lines
2.1 KiB
JavaScript

const fs = require("fs");
const crypto = require('crypto')
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const { window } = new JSDOM("");
global.window = window;
var showdown = require("showdown");
const converterShowdown = new showdown.Converter();
const libxmljs = require("libxmljs");
const getTerm = require("./getTerm.js");
fs.readFile("../../news.xml", "utf8", (err, data) => {
if (err) {
console.error(err);
return;
}
data = data.replace(/<!DOCTYPE.*>/, "");
parseXML(data);
});
fs.mkdir("./markdown-news/", { recursive: true }, (err) => {
if (err) throw err;
});
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();
}
}
// Replace <tt> with <code>
return string
.replaceAll('<tt>', '<code>')
.replaceAll('</tt>', '</code>')
};
const parseXML = (XML) => {
const xmlDoc = libxmljs.parseHtml(XML);
let newsdefsChildren = xmlDoc.get("//newsdefs").childNodes();
let currentTerm = "";
newsdefsChildren.forEach((newsItem) => {
if (newsItem.type() === "element") {
const author = newsItem.attr("author").value();
const date = newsItem.attr("date").value();
currentTerm = getTerm(date + ' EST');
const contentNodes = newsItem.childNodes();
const content = converterShowdown.makeMarkdown(
nodeChildrenToString(contentNodes)
).trim();
const md = `---
author: '${author.replace(/'/g, "''")}'
date: '${(new Date(date + ' EST').toString())}'
---
${content}`;
fs.mkdirSync(
`./markdown-news/${currentTerm.year}/${currentTerm.term}`,
{ recursive: true },
(err) => {
if (err) throw err;
},
);
const path = `./markdown-news/${currentTerm.year}/${
currentTerm.term
}/${date}-${author}-${crypto.randomUUID().slice(0, 6)}.md`;
fs.writeFileSync(path, md, (err) => {
if (err) throw err;
});
}
});
};