node package manager
We need your input. Help make JavaScript better: Take the 2017 JavaScript Ecosystem survey »

pjs-template

PJS Template - An asynchronous templating engine

npm version Dependencies Build Status Code Coverage

An async rendering template engine used by Pajamas. PJS syntax is based on EJS and can handle asynchronous templates easily.

Installation

npm install pjs-template

Usage

var pjs = require('pjs-template');
 
pjs.renderFile(path, data, options, function (err, html) { /* ... */ });
// or 
pjs.render(str, data, options, function (err, html) { /* ... */ });
// or 
var template = pjs.compile(str, options);
template(data, function (err, html) { /* ... */ });

With Express.js:

app.engine('pjs', require('pjs-template').__express);
app.set('view engine', 'pjs');
// You can use 'view options' to set the pjs options 
app.set('view options', {
  cache: true,
  delimiter: '$'
});

Example

Template hello.pjs:

<%
var foo = 'bar';
setTimeout(function () {
  foo = 'PJS';
  done(); // tell PJS it's an async block 
}, 100);
%>
Hello <%= foo %>!

Render the file:

var pjs = require('pjs-template');
 
pjs.renderFile('./hello.pjs', { foo: "bar" }, function (err, html) {
  console.log(html);
  // Display: Hello PJS! 
});

The done() method tell PJS that it's an async block and to wait until done() is called.

If your block is not asynchronous, you don't need to use it:

<% var foo = 'bar'; %>
Hello <%= foo %>!

Will display Hello bar!

Options

  • cache (boolean) - Compiled functions are cached, requires filename option when used with the render method
  • filename - Used by cache to key caches, and for includes
  • watchFiles (boolean) - Require cache: true, watch for changes on the cached files to clear their cache automatically
  • debug - Output generated function body
  • compileDebug - When false no debug instrumentation is compiled
  • delimiter - Character to use with angle brackets for open/close
  • escapeFunction - Custom function for escaping HTML

Tags

  • <% 'Scriptlet' tag, for control-flow, no output
  • <%= Outputs the value into the template (HTML escaped)
  • <%- Outputs the unescaped value into the template
  • <%# Comment tag, no execution, no output
  • <%% Outputs a literal '<%'
  • %> Plain ending tag
  • -%> Trim-mode ('newline slurp') tag, trims following newline

Includes

Includes are relatives to the template with the include call.

<% include ./hello.pjs %>

Customer Delimiters

Custom delimiters can be applied on a per-template basis, or globally:

var pjs = require('pjs-template'),
    users = ['geddy', 'neil', 'alex'];
 
// Just one template 
pjs.render('<?= users.join(" | "); ?>', { users: users }, { delimiter: '?' }, function (err, html) {
  // html = 'geddy | neil | alex' 
});
 
// Or globally 
pjs.delimiter = '$';
pjs.render('<$= users.join(" | "); $>', { users: users }, function (err, html) {
  // html = 'geddy | neil | alex' 
});

Methods

  • pjs.renderFile(path [, data] [, opts], callback)
  • pjs.render(str [, data] [, opts], callback)
  • pjs.compile(str [, opts])
  • pjs.clearCache()
  • pjs.escape(html)