UNPKG

statiq

Version:

A static website generator

92 lines (71 loc) 2.18 kB
const fs = require('fs'); const path = require('path'); const util = require('util'); function blocksPlugin(opts = {}) { const config = { regex: /^<<([a-z0-9]+)\n([\s\S]+)\n\1;$/gim, ...opts, }; return { beforeBuild(document) { document.content = document.content.replace(config.regex, (match, id, block) => { document.context[id] = block.trim(); return ''; }).trim(); return document; }, }; } function markedPlugin(opts = {}) { const marked = require('marked'); const config = { parseMultilineContext: true, ...opts, }; return { beforeBuild(document) { const content = marked(document.content); const context = { ...document.context }; if (config.parseMultilineContext) { Object.entries(context).forEach(([key, value]) => { if (typeof value !== 'string') return; if (value.indexOf('\n') === -1) return; context[key] = marked(value); }); } return { ...document, context, content }; } } } function lessPlugin(opts = {}) { const less = require('less'); return { async beforeAsset(asset) { if (path.extname(asset.assetPath) !== '.less') return asset; const basename = path.basename(asset.assetPath, '.less'); if (opts.main && basename !== path.basename(opts.main, '.less')) return null; asset.publishPath = path.join(path.dirname(asset.publishPath), `${basename}.css`); const source = await util.promisify(fs.readFile)(asset.assetPath, 'utf8'); const output = await less.render(source, { ...opts, filename: asset.assetPath }); await util.promisify(fs.writeFile)(asset.publishPath, output.css); return null; }, }; } function ejsPlugin() { const ejs = require('ejs'); return { beforeBuild(document, template) { const data = { ...document.context, content: document.content }; const options = { filename: document.templatePath }; const content = ejs.render(template, data, options); return { ...document, content }; } }; } module.exports = { blocksPlugin, markedPlugin, lessPlugin, ejsPlugin, };