You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.3 KiB
56 lines
1.3 KiB
#! /usr/bin/env node
|
|
|
|
import markdownTOC from "markdown-toc";
|
|
import nunjucks from "nunjucks";
|
|
import TOML from "@iarna/toml";
|
|
import { readFile } from "node:fs/promises";
|
|
|
|
if (process.argv.length !== 4) {
|
|
console.error("usage: render-template.ts template.njk data.toml");
|
|
process.exit(1);
|
|
}
|
|
const [, , templatePath, dataPath] = process.argv;
|
|
|
|
interface INamedProject {
|
|
name: string;
|
|
[key: string]: string;
|
|
}
|
|
|
|
interface IProjects {
|
|
[key: string]: {
|
|
[key: string]: string;
|
|
};
|
|
}
|
|
|
|
const projList = (projects: IProjects): INamedProject[] =>
|
|
Object.entries(projects)
|
|
.map(([name, info]) =>
|
|
Object.assign({
|
|
name,
|
|
}, info)
|
|
);
|
|
|
|
try {
|
|
const template = (await readFile(templatePath, "utf8")).trim();
|
|
const data = TOML.parse(await readFile(dataPath, "utf8"));
|
|
|
|
const tocToken = `%TOC-${Math.random()}%`;
|
|
const env = nunjucks.configure({
|
|
lstripBlocks: true,
|
|
trimBlocks: true,
|
|
});
|
|
env.addGlobal("toc", tocToken);
|
|
const doc = env.renderString(template, {
|
|
projects: projList(data as IProjects),
|
|
});
|
|
|
|
const headingFilter = (str: string) => !str.match(/Contents/);
|
|
const toc = markdownTOC(doc, {
|
|
filter: headingFilter,
|
|
}).content;
|
|
const docWithTOC = doc.replace(tocToken, toc);
|
|
|
|
console.log(docWithTOC);
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
|