diff options
Diffstat (limited to 'app/builder')
| -rw-r--r-- | app/builder/build.ts | 3 | ||||
| -rw-r--r-- | app/builder/pages.ts | 27 | ||||
| -rw-r--r-- | app/builder/render.ts | 13 |
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; } |
