A Node.js server-side template engine that supports multi-level template inheritance.
[ English | 中文 ]
- Installation
- Features
- Example
- Usage
- Options
- API
- Template Syntax
- Template Inheritance (Layout)
- Other Syntax
- Escaped variable output
- Unescaped variable output
- URL-escaped variable output
- HTML attribute escaped variable output
- Escaped array output
- Money formatting
- Content truncation
- URL protocol adaptation
- Escaped function return value output
- Unescaped function return value output
- Variable definition
- Array iteration
- Conditional output
- Sub-template definition
- Sub-template invocation
$ npm install cb-template
- Supports template inheritance (Layout)
- Modular templates
- Flexible template syntax
<% if (user) %>
<p><%=user.name%></p>
<% /if %>
const cbT = require('cb-template');
const template = cbT.compile(str);
template(data);
// => Rendered HTML string
cbT.render(str, data);
// => Rendered HTML string
// Supports template inheritance
cbT.renderFile(filename, data, options, (err, data) => {
if (!err) {
// => data is rendered HTML string
}
});
Defines the left delimiter, default value: <%
Defines the right delimiter, default value: %>
Defines the root directory for reading template files, default value is an empty string.
For example, if you want to use /my/template
as the root directory for all templates, set cbT.basePath = '/my/template'
Template cache directory, default value is the system temporary directory.
Default extension for template files, default value is .html
Compiles a template string and returns a template function. Does not support template inheritance.
Parameters:
- str: String, input template content
Return value:
Type: Function, template function for subsequent direct template rendering.
Template function parameters:
- data: Object, input data
Example:
const template = cbT.compile(`<title><%=title%></title><p><%=nickname%></p>`);
template({ title: 'Title', nickname: 'Nickname' });
// => Rendered HTML string
Reads a template file and returns a template function. Supports template inheritance.
Parameters:
- filename: String, template file path. If cbT.basePath is set, basePath is used as the root directory. Absolute paths are recommended.
- options: Object, compilation parameters.
- cache: Boolean, whether to enable compilation cache, default is enabled
- callback: Function, callback function executed after compilation.
- Callback function parameters: err: whether there is an error; template: template function
Example:
cbT.compileFile('/your/path/filename.html', {}, (err, template) => {
template({ title: 'Title', nickname: 'Nickname' });
// => Rendered HTML string
});
Compiles a template string and returns the rendered result. Does not support template inheritance.
Parameters:
- str: String, input template content
- data: Object, data for rendering. Object keys are automatically converted to variable names in the template
Return value:
Type: String, rendered string
Example:
cbT.render(`<title><%=title%></title><p><%=nickname%></p>`, { title: 'Title', nickname: 'Nickname' });
// => Rendered HTML string
Reads a template file and returns the rendered result. Supports template inheritance.
Parameters:
- filename: String, template file path. If cbT.basePath is set, basePath is used as the root directory. Absolute paths are recommended.
- data: Object, data for rendering. Object keys are automatically converted to variable names in the template
- options: Object, compilation parameters.
- cache: Boolean, whether to enable compilation cache, default is enabled
- cacheName: String, set cache name, default value
changba-template-cache
. This value is invalid ifcbT.cachePath
is set
- callback: Function, callback function executed after compilation.
- Callback function parameters: err: whether there is an error; content: rendered result
Example:
cbT.renderFile('/your/path/filename.html', { title: 'Title', nickname: 'Nickname' }, {}, (err, content) => {
console.log(content);
// => Rendered HTML string
});
Gets a new instance of the template engine. Generally used to set individual options of the template engine, such as setting left and right delimiters separately.
Example:
const myInstance = cbT.getInstance();
myInstance.render(`<title><%=title%></title><p><%=nickname%></p>`, { title: 'Title', nickname: 'Nickname' });
// => Rendered HTML string
Note: The new instance cannot perform getInstance() operations. You can only getInstance() from cbT.
The default template delimiters are <% %>
, for example: <% block %>
<% extends template_path %>
For example <% extends /welcome/test %>
This refers to inheriting from the template basePath/welcome/test.html
.
Note: The extends
tag must be at the first character position of the first line of the template file. Also, this tag does not need a closing tag.
<% block name %>
content...
<% /block %>
Using block in a parent template means defining a block named "name".
Using block in a child template means replacing the block with the same name in the parent template.
<% block name hide %>
content...
<% /block %>
The hide
attribute means hiding the block with the same name in the parent template in the child template.
<% block name %>
<% parent %>
content...
<% /block %>
The parent
tag can only be used within block
tags. Its function is to place the content of the parent template's block with the same name at the position where parent
is located in the current block.
<% block name %>
<% child %>
content...
<% /block %>
The child
tag can only be used within block
tags. Its function is to place the content of the child template's block with the same name at the position where child
is located in the current block.
<% block name %>
<% slot slot_name %>
content
<% /slot %>
content...
<% /block %>
slot
tag can only be used within block
tags.
The slot
tag is used to define slot positions in parent templates. Child templates will replace the content at the same slot name position in the parent template.
<% block name %>
<% call other_block_name %>
<% slot slot_name %>
content
<% /slot %>
<% /call %>
content...
<% /block %>
<% block name %>
<% call other_block_name slot1="slot_content_1" slot2="slot_content_2" %>
<% slot slot3 %>
slot_content_3
<% /slot %>
<% /call %>
content...
<% /block %>
call
is used to replace the content at the call position with the content of other block names in the current file (supports all parent templates). The meaning of slot
is the same as in the previous section, it will replace the corresponding content.
<% block name %>
<% use other_block_name slot1="slot_content_1" slot2="slot_content_2" %>
content...
<% /block %>
use
is a simplified version of call
.
Parent template parent.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Welcome to <% block title %>Test Title<% /block %></title>
</head>
<body>
<h1>Welcome to <% block name %>Test Content<% /block %>!</h1>
<p>
<% block test-1 %>
Test Content-1
<% /block %>
</p>
<p>
<% block test-2 %>
<small><% child %></small>
Test Content-2
<% /block %>
</p>
</body>
</html>
Child template welcome.html:
<% extends parent %>
<% block title %>Child Template Title<% /block %>
<% block name %><strong>Child Template Content</strong><% /block %>
<% block test-1 %>
<% parent %>
<strong>Child Template Content-1</strong>
<% /block %>
<% block test-2 %>
Child Template Content-2
<% /block %>
Final rendered result:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Welcome to Child Template Title</title>
</head>
<body>
<h1>Welcome to <strong>Child Template Content</strong>!</h1>
<p>
Test Content-1
<strong>Child Template Content-1</strong>
</p>
<p>
<small>Child Template Content-2</small>
Test Content-2
</p>
</body>
</html>
Outputs variable content after HTML escaping, ensuring no XSS security issues.
Basic usage: <%=variable%>
Example:
<title><%=title%></title>
<p><%=nickname%></p>
Outputs variable content as-is. Do not use unless you know what you're doing, as it may cause XSS security issues.
Basic usage: <%:=variable%>
or <%-variable%>
Example:
<title><%:=title%></title>
<p><%-nickname%></p>
Applies URL escaping to variables, commonly used in URL parameters.
Basic usage: <%:u=variable%>
Example:
<a href="https://domain.com/index?title=<%:u=title%>&nickname=<%:u=nickname%>">Link</a>
Escapes HTML attribute values for output, commonly used for safe output of HTML attribute values.
Basic usage: <%:v=variable%>
Example:
<div data-title="<%:v=title%>" data-nickname="<%:v=nickname%>">Content</div>
Iterates through arrays and outputs with HTML escaping.
Basic usage: <%:a=array_variable | separator%>
Separator is optional, default value is <br>
Example:
<div><%:a=listing%></div> <!-- Outputs <div>element0<br>element1<br>element2<div> -->
<div><%:a=listing|,%></div> <!-- Outputs <div>element0,element1,element2<div> -->
Rounds to two decimal places and outputs variable content.
Basic usage: <%:m=variable%>
Example:
<div><%:m=money%></div>
Truncates content and outputs variable. If truncated, automatically adds ...
at the end, otherwise doesn't add.
Basic usage: <%:s=variable | character_count%>
Example:
<div><%:s=title | 10%></div>
Processes URLs into protocol-adaptive format, like //domain.com/index
.
Basic usage: <%:p=variable%>
Example:
<img src="<%:p=avatar%>" alt="Avatar">
Used for escaped output of function return values.
Basic usage: <%:func=function%>
Example:
<p><%:func=getData()%></p>
Outputs function return values without escaping. Use with caution.
Basic usage: <%:func-function%>
Example:
<p><%:func-getData()%></p>
Used to define variables in template scope.
Basic usage: <% let variable_name = variable_value %>
Example:
<% let myData = '123' %>
<p><%=myData%></p>
Generally used for looping through and outputting array content.
Basic usage:
<% foreach (loop_variable in array_variable) %>loop_body<% /foreach %>
<% foreach (loop_variable in array_variable) %>loop_body<% foreachelse %>content_when_array_is_empty<% /foreach %>
If you need to get the array index, you can use the form loop_variableIndex
.
Example:
<ul>
<% foreach (item in listing) %>
<li><%=itemIndex%>: <%=item.nickname%></li>
<% foreachelse %>
<li>No content available</li>
<% /foreach %>
</ul>
Used to output different content based on different conditions
Basic usage:
<% if (standard_js_conditional_expression) %>output_when_condition_is_true<% else %>output_when_condition_is_false<% /if %>
<% if (standard_js_conditional_expression) %>output_when_this_condition_is_true<% elseif (standard_js_conditional_expression) %>output_when_this_condition_is_true<% else %>output_when_no_conditions_match<% /if %>
Example:
<div>
<% if (nickname === 'name1') %>
<p>This is name1</p>
<% elseif (nickname === 'name2') %>
<p>This is name2</p>
<% elseif (nickname === 'name3') %>
<p>This is name3</p>
<% else %>
<p>None of them</p>
<% /if %>
</div>
Generally used to define a common template part for convenient reuse
Basic usage: <% define sub_template_name(parameters) %>sub_template_content<% /define %>
Where parameters
is a valid variable name, used to receive external parameters in the sub-template
Example:
<% define mySubTemplate(params) %>
<p><%=params.nickname%></p>
<p><%=params.title%></p>
<% /define %>
Invokes an already defined sub-template
Basic usage: <% run sub_template_name(parameter_object) %>
Example:
<% run mySubTemplate({ nickname: 'Nickname', title: 'Title' }) %>