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 = "/docs/-/" + 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(); }