@thi.ng/transclude
Version:
Extensible functional template engine for text document generation, incl. various high-level Markdown features
32 lines (31 loc) • 1.11 kB
JavaScript
import { illegalArgs } from "@thi.ng/errors/illegal-arguments";
import { readText } from "@thi.ng/file-io/text";
import { basename, resolve } from "node:path";
const includeFile = ({ logger }, args, currPath) => readText(resolve(resolve(currPath, ".."), args[2].trim()), logger);
const preincludeFile = ({ logger }, [src], initialPath) => {
const pattern = /<!-- include (.+) -->/g;
const fileCache = {};
const replaceImport = (includePath, currPath, route) => {
includePath = resolve(resolve(currPath, ".."), includePath.trim());
if (fileCache[includePath]) return fileCache[includePath];
if (route.includes(includePath))
illegalArgs(
`include cycle detected: ${basename(currPath)} -> ${basename(
includePath
)}`
);
src = readText(includePath, logger).replace(
pattern,
(_, path) => replaceImport(path, includePath, [...route, path])
);
return fileCache[includePath] = src;
};
return src.replace(
pattern,
(_, path) => replaceImport(path, initialPath, [initialPath])
);
};
export {
includeFile,
preincludeFile
};