const { JSDOM } = require("jsdom"); const fs = require("fs"); const converter = require("./showdown")(2); let folder = `${__dirname}/../`; console.log("Refreshing blog sub-sites..."); fs.readFile(`${folder}index.html`, function (_, html) { let templateDom = new JSDOM(html); // remove all non-blog stuff from the template (which is just our index.html) let noBlog = templateDom.window.document.getElementsByClassName("no-blog"); while (noBlog.length > 0) noBlog[0].parentNode.removeChild(noBlog[0]); // change all relative links to move to the parent directory (since we're in blog/) let elements = templateDom.window.document.getElementsByTagName("*"); for (let i = 0; i < elements.length; i++) { let element = elements[i]; if (element.src && element.src.startsWith("./")) element.src = `../${element.src.substring(2)}`; if (element.href && element.href.startsWith("./")) element.href = `../${element.href.substring(2)}`; } let template = templateDom.serialize(); fs.readFile(`${folder}blog/src/posts.json`, function (_, data) { let json = JSON.parse(data.toString()); for (let i = 0; i < json.length; i++) { let post = json[i]; fs.readFile(`${folder}blog/src/${post.id}.md`, function (_, content) { let dom = new JSDOM(template); let document = dom.window.document; document.title += ` - ${post.name}`; document.querySelector('meta[property="og:title"]').setAttribute("content", post.name); document.querySelector('meta[name="description"]').setAttribute("content", post.summary); document.querySelector('meta[property="og:description"]').setAttribute("content", post.summary); let last = getAdjacentPost(json, i, -1); let next = getAdjacentPost(json, i, 1); document.getElementById("nav-items").innerHTML = /*html*/ ` Back to Main Page ${last ? /*html*/ `Previous ${post.cat} Post` : ""} ${next ? /*html*/ `Next ${post.cat} Post` : ""} `; document.getElementById("main").innerHTML = /*html*/ `

${post.name}

${post.archived ? /*html*/ `

This post has been archived.

` : ""} ${converter.makeHtml(content.toString())}
${post.date} ${post.discuss ? /*html*/ `Discuss this post` : ""}
`; let ret = dom.serialize(); fs.mkdir(`${folder}blog`, function () { fs.writeFile(`${folder}blog/${post.id}.html`, ret, function () {}); }); }); } }); }); function getAdjacentPost(json, index, move) { let cat = json[index].cat; while (true) { index += move; let post = json[index]; if (!post) break; if (post.cat === cat && !post.archived) return post; } }