Browse Source

Add TemplateService class to handle rendering templates and layouts

node16
Onja 12 months ago
parent
commit
40cac0c6c8
  1. 80
      src/services/template.js

80
src/services/template.js

@ -0,0 +1,80 @@
const fs = require('fs');
const path = require('path');
const hbs = require('handlebars');
const { basedir } = require('../config/constants');
const emitter = require('./eventEmitter');
class TemplateService {
/**
*
* @param string url
* @return string
*/
getTemplatePath(name) {
// check if template exists before returning it
const templatePath = path.join(basedir, 'src/views/', `${name}.hbs`);
if (fs.existsSync(templatePath)) {
return templatePath;
}
return null;
}
/**
*
* @param string name
* @param object data
* @param object params
* @return string
*/
render(name, data = {}, params = {}) {
const templatePath = this.getTemplatePath(name);
emitter.emit('template.render', { name, templatePath, data, params });
if (!templatePath) {
return '';
}
const template = fs.readFileSync(templatePath, 'utf-8');
const compiledTemplate = hbs.compile(template, params);
return compiledTemplate(data);
}
/**
*
* @param string name
* @param object data
* @param object params
* @return string
*/
renderPage(name, data = {}, layout = 'main', params = {}) {
// Get the page template
const pageTemplate = this.render(`pages/${name}`, data, params);
if ( !pageTemplate ) {
return '';
}
// Get the layout template
const layoutTemplate = this.render(`layout/${layout}`, {...data, ...{ body: pageTemplate }}, params);
if ( !layoutTemplate ) {
return '';
}
return layoutTemplate;
}
}
module.exports = TemplateService;
Loading…
Cancel
Save