Sources on GitHub jsreport-ejs
This tutorial shows how you can add a custom templating engine into jsreport. Adding a custom engine is not such common as adding a custom recipe but still can become handy if you prefer to use a specific engine or have some special requirements that already supported engines doesn't fulfill.
One of the templating engines you may like to add as a custom engine is EJS. With EJS you can assemble html or xml in the quite convenient way using special tags inlining javascript.
<ul>
<% for(var i=0; i<supplies.length; i++) {%>
<li> <%= supplies[i] %> </li>
<% } %>
</ul>
This tutorial shows you how to add support for EJS into jsreport as a custom extension. Before you continue it is recommended to read general information for writing jsreport custom extensions.
The first thing to do is downloading and installing extension starter kit. As the second step you can rename the extension in jsreport.config.js
.
module.exports = {
"name": "ejs",
"main": "lib/main.js"
}
Extension's main server javascript file has to export function which is then called by jsreport during initialization. In the function's body you should add the new EJS engine into the engines collection.
Engine is identified by its name and path to the engine script. The engine implementation needs to be separated into the dedicated file because it will run in the different process for the security reasons.
//ejs.js
module.exports = (reporter, definition) => {
reporter.extensionsManager.engines.push({
name: "ejs",
pathToEngine: require("path").join(__dirname, "engine.js")
});
};
Now it's time to finally implement the EJS rendering function, but first you need to install two packages the function will require.
npm install ejs --save
npm install node.extend --save
The rendering function is then very simple. Only thing you need to do is to merge helpers
object and data
object into one because EJS accepts the single context object with both functions and local attributes on it.
//engine.js
const ejs = require('ejs')
const extend = require('node.extend')
module.exports = (html, helpers, data) => {
const template = ejs.compile(html)
return function (helpers, data) {
const ejsMix = extend(true, helpers, data)
delete ejsMix.filename
return template(ejsMix)
}
}
Now you can hit npm start
and you should be able to reach the jsreport studio on http://localhost:5488
and test the engine.
The best way to distribute the new engine into the public audience is through the npm. To prepare the package for publishing you should change the package name, author and other attributes in package.json
file. Afterwards you can simply type
npm publish
and the package will be publicly available in npm.
The last optional step is to add a syntax highlighting into the jsreport studio, but fortunately, this will be easier than it looks like.
jsreport studio uses ace editor which supports syntax highlighting for the most of the currently used languages. The only thing we need to do is pack the syntax highlighting for ejs and configure the jsreport editor when to use it.
The first lets download and install brace package which includes the syntax highlighting sources
npm install brace --save-dev
Then use studio/main_dev.js
to reference particular brace ejs mode and Studio.templateEditorModeResolvers
to register it.
import Studio from 'jsreport-studio'
import 'brace/mode/ejs'
Studio.templateEditorModeResolvers.push((template) => template.engine === 'ejs' ? 'ejs' : null)