import { Renderer } from "@libs/markdown";
import HighlightPlugin from "@libs/markdown/plugins/highlighting";
import { walk } from "@std/fs";
import * as pathTools from "@std/path";
function injectIntoTemplate(
name: string,
rendered: string,
dirComponents: string[],
): string {
const breadcrumbs = [];
if (name !== "index") {
dirComponents.push(`${name}.html`);
}
if (dirComponents.length > 0) {
breadcrumbs.push(`root`);
} else {
breadcrumbs.push(`root`);
}
for (let i = 0; i < dirComponents.length; ++i) {
const component = dirComponents[i];
const href = "/-/" + dirComponents.filter((_, idx) => idx <= i).join("/");
if (i < dirComponents.length - 1) {
breadcrumbs.push(`${component}`);
} else {
breadcrumbs.push(`${component}`);
}
}
let content = [
"",
"",
"",
[
`Docs: ${name}`,
'',
'',
'',
'',
'',
'',
'',
'',
],
"",
"",
[
``,
rendered,
],
"",
"",
];
while (content.some((x) => Array.isArray(x))) {
content = content.flat();
}
return content.join("");
}
async function renderMarkdown() {
const renderer = await Renderer.with({
plugins: [HighlightPlugin],
});
for await (
const entry of walk("src", { exts: [".md"], includeDirs: false })
) {
const parsed = pathTools.parse(entry.path);
const dirComponents = parsed.dir.split(pathTools.SEPARATOR_PATTERN);
dirComponents.shift();
parsed.dir = pathTools.join("-", ...dirComponents);
parsed.ext = ".html";
parsed.base = `${parsed.name}${parsed.ext}`;
await Deno.mkdir(parsed.dir, { recursive: true });
const content = await renderer.render(await Deno.readTextFile(entry.path));
await Deno.writeTextFile(
pathTools.format(parsed),
injectIntoTemplate(parsed.name, content, dirComponents),
);
}
}
async function copyStaticFiles() {
for await (const entry of walk("static", { includeDirs: false })) {
const parsed = pathTools.parse(entry.path);
const dirComponents = parsed.dir.split(pathTools.SEPARATOR_PATTERN);
dirComponents.shift();
parsed.dir = pathTools.join("-", ...dirComponents);
await Deno.mkdir(parsed.dir, { recursive: true });
await Deno.copyFile(entry.path, pathTools.format(parsed));
}
}
async function main() {
await renderMarkdown();
await copyStaticFiles();
}
if (import.meta.main) {
main();
}