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

70 lines
1.8 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 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();
}
}
return string;
};
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);
const contentNodes = newsItem.childNodes();
const content = converterShowdown.makeMarkdown(
nodeChildrenToString(contentNodes)
);
const mdx = `export const metadata = {
author: ${author},
date: new Date("${date}"),
}
${content}`;
const mdxTitle = `${date}-${author}`;
fs.mkdir(`./markdown-news/${currentTerm}`, { recursive: true }, (err) => {
if (err) throw err;
});
fs.writeFile(
`./markdown-news/${currentTerm}/${mdxTitle}.news.mdx`,
mdx,
(err) => {
if (err) throw err;
}
);
}
});
};