aboutsummaryrefslogtreecommitdiffstats
path: root/app/builder
diff options
context:
space:
mode:
Diffstat (limited to 'app/builder')
-rw-r--r--app/builder/build.ts3
-rw-r--r--app/builder/pages.ts27
-rw-r--r--app/builder/render.ts13
3 files changed, 30 insertions, 13 deletions
diff --git a/app/builder/build.ts b/app/builder/build.ts
index d894518..6807b89 100644
--- a/app/builder/build.ts
+++ b/app/builder/build.ts
@@ -22,6 +22,7 @@ export async function buildPages(): Promise<{ success: boolean, errors: number,
// Load pages
logger.info(`Reading pages from disk...`);
const pageDirectory = new PageDirectory(process.env.PAGES_DIR);
+ await pageDirectory.init();
let pagesCount = Object.keys(pageDirectory.getPages()).length;
logger.info(`Found ${pagesCount} pages.`);
@@ -78,7 +79,7 @@ async function renderPage(page: Page, pageDirectory: PageDirectory): Promise<boo
}
export async function rebuildSinglePage(path: string, pageDirectory: PageDirectory): Promise<boolean> {
- const page = pageDirectory.loadPage(path);
+ const page = await pageDirectory.loadPage(path);
if (!page) {
return false;
}
diff --git a/app/builder/pages.ts b/app/builder/pages.ts
index bc2c14a..1aed94e 100644
--- a/app/builder/pages.ts
+++ b/app/builder/pages.ts
@@ -2,13 +2,16 @@ import { readFileSync } from 'fs';
import glob from 'glob';
import { logger } from '../logger.js'
import { marked } from 'marked';
+import { gfmHeadingId } from 'marked-gfm-heading-id';
import matter from 'gray-matter';
-export function parsePage(page: Page) {
+marked.use(gfmHeadingId());
+
+export async function parsePage(page: Page) {
try {
- const result = matter(page.raw);
- const config = result.data;
- const html = marked.parse(result.content, { mangle: false, headerIds: false });
+ const frontmatter = matter(page.raw);
+ const config = frontmatter.data;
+ const html = marked.parse(frontmatter.content, { mangle: false });
page.html = html;
page.config = config;
@@ -35,21 +38,23 @@ export class PageDirectory {
for (const page in this.pages) {
delete this.pages[page];
}
-
+ }
+
+ public init = async (): Promise<void> => {
const localPages = glob.sync(`**/*.{md,html}`, { cwd: this.pagesPath })
-
- localPages.forEach(this.loadPage);
-
+ for (const page in localPages) {
+ await this.loadPage(localPages[page]);
+ }
this.lastFullBuild = Date.now();
}
- public loadPage = (page: string): Page => {
+ public loadPage = async (page: string): Promise<Page> => {
let route = `/${page.replace(/\.[^.]*$/,'')}`;
let name = /[^/]*$/.exec(route)[0];
let originalPath = page;
let fullPath = `${this.pagesPath}/${page}`
let buildPath = `${process.env.OUTPUT_DIR}/${route}.html`
- let view = `${route}.ejs`
+ let view = `${route}`
let raw: string;
try {
raw = loadRaw(fullPath);
@@ -70,7 +75,7 @@ export class PageDirectory {
config: {}
}
- parsePage(this.pages[route]);
+ await parsePage(this.pages[route]);
return this.pages[route];
}
diff --git a/app/builder/render.ts b/app/builder/render.ts
index ed59cc6..5c1c125 100644
--- a/app/builder/render.ts
+++ b/app/builder/render.ts
@@ -2,6 +2,7 @@ import { Page, PageDirectory } from "./pages";
import ejs from 'ejs';
import path from 'path';
import buildInfo from "../config/info.js";
+import htmlMinify from 'html-minifier-terser';
export async function render(page: Page, pageDirectory: PageDirectory): Promise<string> {
const options = {
@@ -11,5 +12,15 @@ export async function render(page: Page, pageDirectory: PageDirectory): Promise<
},
build: buildInfo,
};
- return await ejs.renderFile(path.join(process.env.VIEWS_DIR, `${page.view}.ejs`), options);
+ const html = await ejs.renderFile(path.join(process.env.VIEWS_DIR, `${page.view}.ejs`), options);
+
+ const minifiedHtml = await htmlMinify.minify(html, {
+ collapseWhitespace: true,
+ removeComments: true,
+ continueOnParseError: true,
+ minifyCSS: true,
+ minifyJS: true,
+ });
+
+ return minifiedHtml;
}