summaryrefslogtreecommitdiff
path: root/index.js
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-01-20 13:43:34 +0100
committerMinteck <contact@minteck.org>2022-01-20 13:43:34 +0100
commitc2aa7bf38fb30de2d04f87f8e7780e4c768ae6b1 (patch)
tree226598e8d17d20e3721358f7c60b1cc6b851163a /index.js
downloadcobalt-c2aa7bf38fb30de2d04f87f8e7780e4c768ae6b1.tar.gz
cobalt-c2aa7bf38fb30de2d04f87f8e7780e4c768ae6b1.tar.bz2
cobalt-c2aa7bf38fb30de2d04f87f8e7780e4c768ae6b1.zip
Initial commit
Diffstat (limited to 'index.js')
-rw-r--r--index.js177
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