Terrace/docs/renderer/render.js
Joshua Bemenderfer 9d9757e868 Updates.
2025-09-08 16:24:38 -04:00

69 lines
1.9 KiB
JavaScript

import fs from 'node:fs/promises'
import path from 'node:path'
import nunjucks from 'nunjucks'
import HighlightJS from 'highlight.js'
import readPage from '../read-page/index.js'
import googleFonts from './util/google-fonts.js'
import featherIcons from './util/feather-icons.js'
const pages = {
'/': './pages/index.tce',
'/about/': './pages/about.tce',
'/docs/javascript/': './pages/docs/javascript.tce',
'/docs/c/': './pages/docs/c.tce',
'/docs/go/': './pages/docs/go.tce',
'/docs/rust/': './pages/docs/rust.tce',
'/docs/python/': './pages/docs/python.tce'
}
async function render() {
// await fs.rm('dist', { recursive: true })
for (const [urlPath, filePath] of Object.entries(pages)) {
const env = nunjucks.configure('renderer/', { autoescape: false })
env.addFilter('googleFonts', async (val, cb) => {
try {
cb(null, await googleFonts(val))
} catch (e) {
cb(e)
}
}, true)
env.addGlobal('featherIcons', featherIcons)
HighlightJS.registerLanguage('terrace', () => ({
name: 'Terrace',
contains: [
{
className: 'keyword',
begin: /^\s*(.*?)(?:\s|$)/,
relevance: 1
}
]
}))
env.addFilter("highlight", (value, language) => {
return HighlightJS.highlight(value, { language }).value
})
const page = await readPage(filePath)
const result = await new Promise((resolve, reject) => {
env.render('layout.njk', { page, url: urlPath, file: filePath }, (err, res) => {
if (err) return reject(err)
resolve(res)
})
})
await fs.mkdir(path.join('dist', urlPath), { recursive: true })
await fs.writeFile(path.join('dist', urlPath, 'index.html'), result)
}
// await fs.cp('node_modules/highlight.js/styles/atom-one-dark.css', '');
await fs.cp('./public/', './dist/public/', { recursive: true })
await fs.cp('./favicon.ico', './dist/favicon.ico', { recursive: true })
}
render()