import Handlebars from "handlebars"; import * as fs from "fs"; import * as sass from "sass"; import * as YAML from "yaml"; import { unified } from "unified"; import remarkParse from "remark-parse"; import remarkGfm from "remark-gfm"; import remarkToc from "remark-toc"; import remarkRehype from "remark-rehype"; import rehypeSlug from "rehype-slug"; import rehypeStringify from "rehype-stringify"; deletePreviousBuild(); loadPartials(); buildPages(); buildMarkdownPages(); copyAssets(); buildStyles(); function deletePreviousBuild() { if (fs.existsSync("./build")) fs.rmSync("./build", { recursive: true }); fs.mkdirSync("./build"); } function loadPartials() { fs.readdirSync("./partials").forEach((file) => { if (!file.endsWith(".hbs")) return; const template = fs.readFileSync(`./partials/${file}`, "utf8"); const templateName = file.substring(0, file.length - 4); Handlebars.registerPartial(templateName, template); }); } function getData() { const data = YAML.parse(fs.readFileSync("./data.yaml", "utf8")); return { data, year: new Date().getFullYear(), }; } function buildPages() { if (!fs.existsSync("./build")) fs.mkdirSync("./build"); fs.readdirSync("./pages").forEach((file) => { if (!file.endsWith(".hbs")) return; if (file.startsWith("_")) return; const template = Handlebars.compile( fs.readFileSync(`./pages/${file}`, "utf8") ); const result = template(getData()); fs.writeFileSync( `./build/${file.substring(0, file.length - 4)}.html`, result ); }); } function buildMarkdownPages() { if (!fs.existsSync("./build")) fs.mkdirSync("./build"); fs.readdirSync("./pages").forEach(async (file) => { if (!file.endsWith(".md")) return; if (file.startsWith("_")) return; const template = Handlebars.compile( fs.readFileSync("./pages/_markdown.hbs", "utf8") ); const processor = unified() .use(remarkParse) .use(remarkGfm) .use(remarkToc, { heading: "(table[ -]of[ -])?contents?|toc|inhalts?(verzeichnis)?", }) .use(remarkRehype) .use(rehypeSlug) .use(rehypeStringify); const markdown = ( await processor.process( handleDynamicMarkdown(fs.readFileSync(`./pages/${file}`, "utf8")) ) ).toString(); console.log(markdown); const result = template({ data: getData(), markdown, }); fs.writeFileSync( `./build/${file.substring(0, file.length - 3)}.html`, result ); }); } function handleDynamicMarkdown(md) { const replacers = { SCOPE: () => { return getData() .data.domains.map((d) => `- [${d}](https://${d})`) .join("\n"); }, }; Object.keys(replacers).forEach((key) => { md = md.replace(new RegExp(`\\[\\[${key}\\]\\]`, "gm"), replacers[key]()); }); return md; } function copyAssets() { fs.cpSync("./assets", "./build/assets", { recursive: true }); } function buildStyles() { if (!fs.existsSync("./build")) fs.mkdirSync("./build"); if (!fs.existsSync("./build/styles")) fs.mkdirSync("./build/styles"); if (!fs.existsSync("./sass")) return; fs.readdirSync("./sass").forEach((file) => { console.log(1); if (!(file.endsWith(".scss") || file.endsWith(".sass"))) return; console.log(2); if (file.startsWith("_")) return; console.log(3); const result = sass.compile(`./sass/${file}`, { style: "compressed", }); console.log(4); fs.writeFileSync("./build/styles/styles.css", result.css); }); }