96 lines
2.7 KiB
JavaScript
96 lines
2.7 KiB
JavaScript
|
const { promises: fs } = require("fs");
|
||
|
const path = require("path");
|
||
|
const { html: beautifyHtml } = require('js-beautify');
|
||
|
|
||
|
const buildConfig = require("./buildconfig");
|
||
|
|
||
|
// source: https://stackoverflow.com/a/41407246
|
||
|
const escapeCodes = {
|
||
|
reset: "\x1b[0m",
|
||
|
bright: "\x1b[1m",
|
||
|
dim: "\x1b[2m",
|
||
|
underscore: "\x1b[4m",
|
||
|
blink: "\x1b[5m",
|
||
|
reverse: "\x1b[7m",
|
||
|
hidden: "\x1b[8m",
|
||
|
|
||
|
fgBlack: "\x1b[30m",
|
||
|
fgRed: "\x1b[31m",
|
||
|
fgGreen: "\x1b[32m",
|
||
|
fgYellow: "\x1b[33m",
|
||
|
fgBlue: "\x1b[34m",
|
||
|
fgMagenta: "\x1b[35m",
|
||
|
fgCyan: "\x1b[36m",
|
||
|
fgWhite: "\x1b[37m",
|
||
|
|
||
|
bgBlack: "\x1b[40m",
|
||
|
bgRed: "\x1b[41m",
|
||
|
bgGreen: "\x1b[42m",
|
||
|
bgYellow: "\x1b[43m",
|
||
|
bgBlue: "\x1b[44m",
|
||
|
bgMagenta: "\x1b[45m",
|
||
|
bgCyan: "\x1b[46m",
|
||
|
bgWhite: "\x1b[47m",
|
||
|
};
|
||
|
|
||
|
if (!buildConfig.allowSpecialCharacters) {
|
||
|
for (i in escapeCodes) {
|
||
|
escapeCodes[i] = "";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const specialCharacter = (c) => {
|
||
|
if (buildConfig.allowSpecialCharacters) {
|
||
|
return c;
|
||
|
}
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
const processPageOutput = (out) => {
|
||
|
if (typeof out !== "string") {
|
||
|
throw new Error("got non-string page output (maybe one of the pages isn't exporting a string?)");
|
||
|
}
|
||
|
|
||
|
if (buildConfig.postProcessing.trimOutput) {
|
||
|
out = out.trim();
|
||
|
}
|
||
|
|
||
|
if (buildConfig.postProcessing.beautifyOutput) {
|
||
|
out = beautifyHtml(out, buildConfig.postProcessing.beautifyOutputOptions);
|
||
|
}
|
||
|
|
||
|
return out;
|
||
|
};
|
||
|
|
||
|
const findAllPages = async (directory) =>
|
||
|
(await fs.readdir(directory))
|
||
|
.filter(
|
||
|
f => f.endsWith(buildConfig.pageExtension)
|
||
|
)
|
||
|
.map(f => directory + "/" + f); // TODO: hack
|
||
|
|
||
|
const buildPage = (pagePath) => processPageOutput(require(pagePath));
|
||
|
|
||
|
const buildAllPages = async (directory) =>
|
||
|
(await findAllPages(directory))
|
||
|
.map(
|
||
|
p => [p, buildPage(p)]
|
||
|
);
|
||
|
|
||
|
const exportAllPages = async (sourcePath, outputPath) => {
|
||
|
const pages = await buildAllPages(sourcePath);
|
||
|
for (const [pagePath, pageContent] of pages) {
|
||
|
const pageName = path.parse(path.basename(pagePath, buildConfig.pageExtension)).name;
|
||
|
await fs.writeFile(path.join(outputPath, pageName + ".html"), pageContent);
|
||
|
console.log(`${escapeCodes.fgGreen}${specialCharacter("→")}${escapeCodes.reset} Built ${escapeCodes.fgBlue}${pageName}${escapeCodes.reset}`);
|
||
|
}
|
||
|
return pages.length;
|
||
|
};
|
||
|
|
||
|
const main = async () => {
|
||
|
const startTime = new Date();
|
||
|
const builtPages = await exportAllPages(buildConfig.sourceDirectory, buildConfig.outputDirectory);
|
||
|
console.log(`${escapeCodes.fgGreen}${specialCharacter("✓")} Done! ${escapeCodes.fgBlue}Built ${builtPages} pages in ${((new Date()) - startTime)}ms.${escapeCodes.reset}`);
|
||
|
};
|
||
|
|
||
|
main();
|