summaryrefslogtreecommitdiff
path: root/modules/blog/template.js
blob: 38ce72eb1898fd4f0d97354854e2cb44ffd89cae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
const fs = require("fs").promises;

const pathRoot = "blog";

async function recursiveTree(dir) {
	const res = new Map();

	const entries = await fs.readdir(dir, { withFileTypes: true });
	for (const entry of entries) {
		if (entry.name[0] == ".") continue;

		if (entry.isDirectory()) {
			res.set(entry.name, await recursiveTree(dir + "/" + entry.name));
		} else if (entry.isFile() && entry.name.endsWith(".html")) {
			res.set(entry.name.slice(0, entry.name.length - 5), true);
		}
	}

	return res;
}

function generateTree(tree, path) {
	let out = "";

	for (const [entry, sub] of tree) {
		if (sub === true) {  // file
			const elt = `<div class="tree-node tree-file"><a href="/${path}/${entry}">${entry}</a></div>\n`;
			out += elt;
		} else {  // subdirectory
			out += '<div class="tree-node tree-dir">\n';
			out += `<span class="tree-dir-name">${entry}/</span>\n`;
			out += '<div class="tree-sub">\n';
			out += generateTree(sub, path + "/" + entry);
			out += "</div></div>\n";
		}
	}

	return out;
}

async function template(repodir, contentPath) {
	const tree = await recursiveTree(repodir);
	tree.delete("$template");
	tree.delete("index");

	let html = await fs.readFile(repodir + "/$template.html", { encoding: "utf-8" });

	html = html.replace("<!-- REPLACE TREE -->", generateTree(tree, pathRoot));
	if (contentPath) {
		const content = await fs.readFile(repodir + "/" + contentPath, { encoding: "utf-8" });
		html = html.replace("<!-- REPLACE CONTENT -->", content);
	}

	return html;
}

module.exports = template;