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