You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
webpack-plugin/src/engines/nunjucks.js

99 lines
2.5 KiB

const nunjucks = require('nunjucks')
const fs = require('fs')
1 year ago
const assign = require('assign-deep')
const { minify } = require('html-minifier')
1 year ago
1 year ago
const configStore = require('./../config.js')
const { asset, resize } = require('./helpers.js')
1 year ago
const PageQuery = require('./../queries/pages.js')
1 year ago
const dayjs = require('dayjs')
1 year ago
/**
1 year ago
* nunjucks
*
1 year ago
*
* @author Björn Hase <me@herr-hase.wtf>
* @license http://opensource.org/licenses/MIT The MIT License
1 year ago
* @link https://gitea.node001.net/HerrHase/siteomat-webpack-plugin.git
1 year ago
*
*/
class Engine {
1 year ago
/**
*
*
* @param {string} views
* @param {object} site
* @param {object} options
*
*/
1 year ago
constructor(views, site, options) {
1 year ago
// merge data
this._options = assign({}, {
1 year ago
autoescapes: true,
throwOnUndefined: true
1 year ago
}, options)
this.nunjucks = nunjucks.configure(views, this._options)
1 year ago
// add filter: resize
this.nunjucks.addFilter('resize', (...args) => {
const done = args.pop()
const options = args?.[2] ? {} : args[2]
resize(args[0], args[1], options, done)
}, true)
1 year ago
1 year ago
// adding defaults for view, data from site.yml, functions and pageQuery
1 year ago
this._defaults = {
site: site,
asset: asset,
1 year ago
dayjs: dayjs,
pageQuery: new PageQuery(configStore.get('source'))
1 year ago
}
}
/**
* render
*
1 year ago
* @param {object} page
* @param {function} done
1 year ago
*
*/
render(page, done) {
1 year ago
// merge data
const data = assign({
page: page
}, this._defaults)
this.nunjucks.render(data.page.view, data, (error, response) => {
1 year ago
if (error) {
console.error(error)
}
const options = configStore.get('options')
1 year ago
// if options minifyHtml is set, minify html, but only if page has type html
1 year ago
if (options.minifyHtml === true && data.page.type === 'html') {
response = minify(response, {
removeComments: true,
collapseWhitespace: true,
1 year ago
keepClosingSlash: true,
removeOptionalTags: false
})
1 year ago
// remove empty lines
1 year ago
} else {
response = response.replace(/^(?:[\t ]*(?:\r?\n|\r))+/gm, '')
}
done(error, response)
1 year ago
})
}
}
module.exports = Engine