diff options
Diffstat (limited to 'index.js')
-rw-r--r-- | index.js | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/index.js b/index.js new file mode 100644 index 0000000..20bcebf --- /dev/null +++ b/index.js @@ -0,0 +1,177 @@ +const fs = require('fs'); +const path = require('path'); +const uniqueid = require('./modules/uniqueid'); +const md = require('markdown-it')("commonmark", { + html: true, + linkify: true, + typographer: true +}); + +global.files = []; +global.directories = []; +global.sitemap = ""; + +global.afiles = []; +global.adirectories = []; +global.asitemap = ""; +global.sitemaps = {}; + +function analyze(dir, levels) { + let dfiles = fs.readdirSync(dir); + + for (let file of dfiles) { + if (fs.lstatSync(dir + "/" + file).isDirectory()) { + id = uniqueid(dir + "/" + file) + directories.push({ + source: dir + "/" + file, + dest: "./output/" + id, + name: file, + id + }) + sitemap = sitemap + "\n" + " ".repeat(levels - 1) + "* [" + file + "](./" + id + "/index.html)"; + analyze(dir + "/" + file, levels + 1); + } else if (file.endsWith(".md")) { + if (path.basename(file) === "index.md") { + id = uniqueid(dir + "/" + file) + files.push({ + source: dir + "/" + file, + dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html", + name: file, + id, + parent: { + path: "./index.html", + name: "index" + } + }) + } else { + id = uniqueid(dir + "/" + file) + files.push({ + source: dir + "/" + file, + dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html", + name: file, + id, + parent: { + path: "./" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html", + name: path.basename(path.dirname(dir + "/" + file)) + } + }) + sitemap = sitemap + "\n" + " ".repeat(levels - 1) + "* [" + file.substring(0, file.length - 3) + "](./" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html)"; + } + } + } +} + +function aanalyze(dir, levels) { + let dfiles = fs.readdirSync(dir); + + for (let file of dfiles) { + if (fs.lstatSync(dir + "/" + file).isDirectory()) { + id = uniqueid(dir + "/" + file) + adirectories.push({ + source: dir + "/" + file, + dest: "./output/" + id, + name: file, + id + }) + asitemap = asitemap + "\n" + " ".repeat(levels - 1) + "* [" + file + "](../" + id + "/index.html)"; + aanalyze(dir + "/" + file, levels + 1); + } else if (file.endsWith(".md")) { + if (path.basename(file) === "index.md") { + id = uniqueid(dir + "/" + file) + afiles.push({ + source: dir + "/" + file, + dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html", + name: file, + id, + parent: { + path: "./index.html", + name: "index" + } + }) + } else { + id = uniqueid(dir + "/" + file) + afiles.push({ + source: dir + "/" + file, + dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html", + name: file, + id, + parent: { + path: "./" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html", + name: path.basename(path.dirname(dir + "/" + file)) + } + }) + asitemap = asitemap + "\n" + " ".repeat(levels - 1) + "* [" + file.substring(0, file.length - 3) + "](../" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html)"; + } + } + } +} + +console.log("Preparing output directory..."); + +if (fs.existsSync("./output")) fs.rmSync("./output", { recursive: true }); +fs.mkdirSync("./output"); + +if (fs.existsSync("./cache")) fs.rmSync("./cache", { recursive: true }); +fs.mkdirSync("./cache"); + +console.log("Analyzing..."); +analyze("./data", 1); + +fs.writeFileSync("./cache/map.json", JSON.stringify({ + files, + directories +}, false, 4)); + +fs.writeFileSync("./cache/navigation.md", sitemap); + +console.log("Creating required directories..."); +for (let dir of directories) { + fs.mkdirSync(dir.dest); +} + +console.log("Loading templates..."); +header = fs.readFileSync("./templates/header.html").toString(); +footer = fs.readFileSync("./templates/footer.html").toString(); + +console.log("Generating sitemaps for every directory..."); +for (let dir of directories) { + global.afiles = []; + global.adirectories = []; + global.asitemap = ""; + aanalyze(dir.source, 1); + fs.writeFileSync("./cache/navigation-" + uniqueid(dir.source) + ".md", asitemap); + fs.writeFileSync("./cache/map-" + uniqueid(dir.source) + ".json", JSON.stringify({ + afiles, + adirectories + }, false, 4)); + sitemaps[uniqueid(dir.source)] = asitemap; +} + +console.log("Rendering pages..."); +for (let page of files) { + content = md.render(fs.readFileSync(page.source).toString()); + fs.writeFileSync(page.dest, header.replaceAll("$TITLE$", page.name) + "<a href=\"." + page.parent.path + "\">« " + page.parent.name + "</a><hr>" + content + footer.replaceAll("$TITLE$", page.name)); +} + +console.log("Generating home page..."); +if (fs.existsSync("./data/index.md")) { + content = md.render(fs.readFileSync(page.source).toString()) + "<hr>"; +} else { + content = ""; +} +fs.writeFileSync("./output/index.html", header.replaceAll("$TITLE$", "Home") + "Home<hr>" + content + md.render(sitemap) + footer.replaceAll("$TITLE$", "Home")); + +console.log("Generating missing index files..."); +for (let dir of directories) { + if (!fs.existsSync(dir.dest + "/index.html")) { + if (sitemaps[dir.id].trim() !== "") { + fs.writeFileSync(dir.dest + "/index.html", header.replaceAll("$TITLE$", dir.name) + "<a href=\"../index.html\">« index</a><hr>" + md.render(sitemaps[dir.id]) + footer.replaceAll("$TITLE$", dir.name)); + } else { + fs.writeFileSync(dir.dest + "/index.html", "<script>location.href = \"../index.html\";</script>"); + } + } else { + if (sitemaps[dir.id].trim() !== "") { + fs.writeFileSync(dir.dest + "/index.html", header.replaceAll("$TITLE$", dir.name) + "<a href=\"../index.html\">« index</a><hr>" + md.render(fs.readFileSync(dir.source + "/index.md").toString()) + "<hr>" + md.render(sitemaps[dir.id]) + footer.replaceAll("$TITLE$", dir.name)); + } + } +}
\ No newline at end of file |