UNPKG

ndut-view

Version:

View Engine for Ndut Framework

138 lines (123 loc) 3.16 kB
const { Environment, Template } = require("nunjucks") const lib = require('nunjucks/src/lib') class NewEnvironment extends Environment { // Add 'theme' params render(name, ctx, theme, cb) { // Change this if (lib.isFunction(ctx)) { cb = ctx theme = 'default' ctx = null } if (lib.isFunction(theme)) { cb = theme theme = 'default' } theme = theme || 'default' name += ':' + theme // End let syncResult = null this.getTemplate(name, (err, tmpl) => { if (err && cb) { callbackAsap(cb, err); } else if (err) { throw err; } else { syncResult = tmpl.render(ctx, cb) } }) return syncResult } getTemplate(name, eagerCompile, parentName, ignoreMissing, cb) { var that = this; var tmpl = null; if (name && name.raw) { // this fixes autoescape for templates referenced in symbols name = name.raw; } if (lib.isFunction(parentName)) { cb = parentName; parentName = null; eagerCompile = eagerCompile || false; } if (lib.isFunction(eagerCompile)) { cb = eagerCompile; eagerCompile = false; } if (name instanceof Template) { tmpl = name; } else if (typeof name !== 'string') { throw new Error('template names must be a string: ' + name); } else { for (let i = 0; i < this.loaders.length; i++) { const loader = this.loaders[i]; tmpl = loader.cache[this.resolveTemplate(loader, parentName, name)]; if (tmpl) { break; } } } if (tmpl) { if (eagerCompile) { tmpl.compile(); } if (cb) { cb(null, tmpl); return undefined; } else { return tmpl; } } let syncResult; const createTemplate = (err, info) => { if (!info && !err && !ignoreMissing) { err = new Error('template not found: ' + name); } if (err) { if (cb) { cb(err); return; } else { throw err; } } let newTmpl; if (!info) { newTmpl = new Template(noopTmplSrc, this, '', eagerCompile); } else { newTmpl = new Template(info.src, this, info.path, eagerCompile); if (!info.noCache) { info.loader.cache[name] = newTmpl; } } if (cb) { cb(null, newTmpl); } else { syncResult = newTmpl; } }; lib.asyncIter(this.loaders, (loader, i, next, done) => { function handle(err, src) { if (err) { done(err); } else if (src) { src.loader = loader; done(null, src); } else { next(); } } // Added this const theme = name.split(':')[2] // End name = that.resolveTemplate(loader, parentName, name); if (loader.async) { loader.getSource(name, theme, handle); // add 'theme' } else { handle(null, loader.getSource(name, theme)); // add 'theme' } }, createTemplate); return syncResult; } } module.exports = NewEnvironment