Rinser/node_modules/ejs/README.md

270 lines
9.2 KiB
Markdown
Raw Normal View History

2015-07-20 13:42:07 +00:00
# EJS
Embedded JavaScript templates
[![Build Status](https://img.shields.io/travis/mde/ejs/master.svg?style=flat)](https://travis-ci.org/mde/ejs)
2018-06-01 09:24:32 +00:00
[![Developing Dependencies](https://img.shields.io/david/dev/mde/ejs.svg?style=flat)](https://david-dm.org/mde/ejs?type=dev)
[![Known Vulnerabilities](https://snyk.io/test/npm/ejs/badge.svg?style=flat-square)](https://snyk.io/test/npm/ejs)
2015-07-20 13:42:07 +00:00
## Installation
```bash
$ npm install ejs
```
## Features
* Control flow with `<% %>`
2016-06-15 13:38:21 +00:00
* Escaped output with `<%= %>` (escape function configurable)
2015-07-20 13:42:07 +00:00
* Unescaped raw output with `<%- %>`
2016-02-12 13:10:16 +00:00
* Newline-trim mode ('newline slurping') with `-%>` ending tag
* Whitespace-trim mode (slurp all whitespace) for control flow with `<%_ _%>`
2018-06-01 09:24:32 +00:00
* Custom delimiters (e.g., use `<? ?>` instead of `<% %>`)
2015-07-20 13:42:07 +00:00
* Includes
* Client-side support
* Static caching of intermediate JavaScript
* Static caching of templates
* Complies with the [Express](http://expressjs.com) view system
## Example
```html
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
```
2018-06-01 09:24:32 +00:00
Try EJS online at: https://ionicabizau.github.io/ejs-playground/.
2015-07-20 13:42:07 +00:00
## Usage
```javascript
2018-06-01 09:24:32 +00:00
let template = ejs.compile(str, options);
2015-07-20 13:42:07 +00:00
template(data);
// => Rendered HTML string
ejs.render(str, data, options);
// => Rendered HTML string
2016-06-15 13:38:21 +00:00
ejs.renderFile(filename, data, options, function(err, str){
// str => Rendered HTML string
});
2015-07-20 13:42:07 +00:00
```
2016-06-15 13:38:21 +00:00
It is also possible to use `ejs.render(dataAndOptions);` where you pass
2015-07-20 13:42:07 +00:00
everything in a single object. In that case, you'll end up with local variables
2018-06-01 09:24:32 +00:00
for all the passed options. However, be aware that your code could break if we
2016-06-15 13:38:21 +00:00
add an option with the same name as one of your data object's properties.
Therefore, we do not recommend using this shortcut.
2015-07-20 13:42:07 +00:00
## Options
2018-06-01 09:24:32 +00:00
- `cache` Compiled functions are cached, requires `filename`
- `filename` The name of the file being rendered. Not required if you
2016-06-15 13:38:21 +00:00
are using `renderFile()`. Used by `cache` to key caches, and for includes.
2018-06-01 09:24:32 +00:00
- `root` Set project root for includes with an absolute path (/file.ejs).
- `context` Function execution context
- `compileDebug` When `false` no debug instrumentation is compiled
- `client` When `true`, compiles a function that can be rendered
in the browser without needing to load the EJS Runtime
2016-06-15 13:38:21 +00:00
([ejs.min.js](https://github.com/mde/ejs/releases/latest)).
2018-06-01 09:24:32 +00:00
- `delimiter` Character to use with angle brackets for open/close
- `debug` Output generated function body
- `strict` When set to `true`, generated function is in strict mode
- `_with` Whether or not to use `with() {}` constructs. If `false`
then the locals will be stored in the `locals` object. Set to `false` in strict mode.
- `localsName` Name to use for the object storing local variables when not using
`with` Defaults to `locals`
- `rmWhitespace` Remove all safe-to-remove whitespace, including leading
2015-07-20 13:42:07 +00:00
and trailing whitespace. It also enables a safer version of `-%>` line
slurping for all scriptlet tags (it does not strip new lines of tags in
the middle of a line).
2018-06-01 09:24:32 +00:00
- `escape` The escaping function used with `<%=` construct. It is
used in rendering and is `.toString()`ed in the generation of client functions.
(By default escapes XML).
- `outputFunctionName` Set to a string (e.g., 'echo' or 'print') for a function to print
output inside scriptlet tags.
- `async` When `true`, EJS will use an async function for rendering. (Depends
on async/await support in the JS runtime.
This project uses [JSDoc](http://usejsdoc.org/). For the full public API
documentation, clone the repository and run `npm run doc`. This will run JSDoc
with the proper options and output the documentation to `out/`. If you want
2016-06-15 13:38:21 +00:00
the both the public & private API docs, run `npm run devdoc` instead.
2015-07-20 13:42:07 +00:00
## Tags
- `<%` 'Scriptlet' tag, for control-flow, no output
2016-06-15 13:38:21 +00:00
- `<%_` 'Whitespace Slurping' Scriptlet tag, strips all whitespace before it
- `<%=` Outputs the value into the template (escaped)
2015-07-20 13:42:07 +00:00
- `<%-` Outputs the unescaped value into the template
- `<%#` Comment tag, no execution, no output
- `<%%` Outputs a literal '<%'
2018-06-01 09:24:32 +00:00
- `%%>` Outputs a literal '%>'
2015-07-20 13:42:07 +00:00
- `%>` Plain ending tag
- `-%>` Trim-mode ('newline slurp') tag, trims following newline
2016-06-15 13:38:21 +00:00
- `_%>` 'Whitespace Slurping' ending tag, removes all whitespace after it
For the full syntax documentation, please see [docs/syntax.md](https://github.com/mde/ejs/blob/master/docs/syntax.md).
2015-07-20 13:42:07 +00:00
## Includes
Includes either have to be an absolute path, or, if not, are assumed as
2018-06-01 09:24:32 +00:00
relative to the template with the `include` call. For example if you are
including `./views/user/show.ejs` from `./views/users.ejs` you would
2016-06-15 13:38:21 +00:00
use `<%- include('user/show') %>`.
2018-06-01 09:24:32 +00:00
You must specify the `filename` option for the template with the `include`
2016-06-15 13:38:21 +00:00
call unless you are using `renderFile()`.
2015-07-20 13:42:07 +00:00
You'll likely want to use the raw output tag (`<%-`) with your include to avoid
double-escaping the HTML output.
```html
<ul>
<% users.forEach(function(user){ %>
<%- include('user/show', {user: user}) %>
<% }); %>
</ul>
```
Includes are inserted at runtime, so you can use variables for the path in the
`include` call (for example `<%- include(somePath) %>`). Variables in your
top-level data object are available to all your includes, but local variables
need to be passed down.
NOTE: Include preprocessor directives (`<% include user/show %>`) are
still supported.
## Custom delimiters
Custom delimiters can be applied on a per-template basis, or globally:
```javascript
2018-06-01 09:24:32 +00:00
let ejs = require('ejs'),
2015-07-20 13:42:07 +00:00
users = ['geddy', 'neil', 'alex'];
// Just one template
ejs.render('<?= users.join(" | "); ?>', {users: users}, {delimiter: '?'});
// => 'geddy | neil | alex'
// Or globally
ejs.delimiter = '$';
ejs.render('<$= users.join(" | "); $>', {users: users});
// => 'geddy | neil | alex'
```
## Caching
EJS ships with a basic in-process cache for caching the intermediate JavaScript
functions used to render templates. It's easy to plug in LRU caching using
Node's `lru-cache` library:
```javascript
2018-06-01 09:24:32 +00:00
let ejs = require('ejs'),
LRU = require('lru-cache');
2015-07-20 13:42:07 +00:00
ejs.cache = LRU(100); // LRU cache with 100-item limit
```
If you want to clear the EJS cache, call `ejs.clearCache`. If you're using the
LRU cache and need a different limit, simple reset `ejs.cache` to a new instance
of the LRU.
2018-06-01 09:24:32 +00:00
## Custom file loader
The default file loader is `fs.readFileSync`, if you want to customize it, you can set ejs.fileLoader.
```javascript
let ejs = require('ejs');
let myFileLoad = function (filePath) {
return 'myFileLoad: ' + fs.readFileSync(filePath);
};
ejs.fileLoader = myFileLoad;
```
With this feature, you can preprocess the template before reading it.
2015-07-20 13:42:07 +00:00
## Layouts
EJS does not specifically support blocks, but layouts can be implemented by
including headers and footers, like so:
```html
<%- include('header') -%>
<h1>
Title
</h1>
<p>
My page
</p>
<%- include('footer') -%>
```
## Client-side support
Go to the [Latest Release](https://github.com/mde/ejs/releases/latest), download
2018-06-01 09:24:32 +00:00
`./ejs.js` or `./ejs.min.js`. Alternately, you can compile it yourself by cloning
the repository and running `jake build` (or `$(npm bin)/jake build` if jake is
2016-06-15 13:38:21 +00:00
not installed globally).
Include one of these files on your page, and `ejs` should be available globally.
### Example
```html
<div id="output"></div>
<script src="ejs.min.js"></script>
<script>
2018-06-01 09:24:32 +00:00
let people = ['geddy', 'neil', 'alex'],
2016-06-15 13:38:21 +00:00
html = ejs.render('<%= people.join(", "); %>', {people: people});
// With jQuery:
$('#output').html(html);
// Vanilla JS:
document.getElementById('output').innerHTML = html;
</script>
```
2015-07-20 13:42:07 +00:00
2016-06-15 13:38:21 +00:00
### Caveats
Most of EJS will work as expected; however, there are a few things to note:
1. Obviously, since you do not have access to the filesystem, `ejs.renderFile()` won't work.
2018-06-01 09:24:32 +00:00
2. For the same reason, `include`s do not work unless you use an `include callback`. Here is an example:
2016-06-15 13:38:21 +00:00
```javascript
2018-06-01 09:24:32 +00:00
let str = "Hello <%= include('file', {person: 'John'}); %>",
2016-06-15 13:38:21 +00:00
fn = ejs.compile(str, {client: true});
2018-06-01 09:24:32 +00:00
fn(data, null, function(path, d){ // include callback
2016-06-15 13:38:21 +00:00
// path -> 'file'
// d -> {person: 'John'}
2018-06-01 09:24:32 +00:00
// Put your code here
2016-06-15 13:38:21 +00:00
// Return the contents of file as a string
}); // returns rendered string
```
2015-07-20 13:42:07 +00:00
2018-06-01 09:24:32 +00:00
### IDE Integration with Syntax Highlighting
VSCode:Javascript EJS by *DigitalBrainstem*
2015-07-20 13:42:07 +00:00
## Related projects
There are a number of implementations of EJS:
* TJ's implementation, the v1 of this library: https://github.com/tj/ejs
* Jupiter Consulting's EJS: http://www.embeddedjs.com/
* EJS Embedded JavaScript Framework on Google Code: https://code.google.com/p/embeddedjavascript/
* Sam Stephenson's Ruby implementation: https://rubygems.org/gems/ejs
* Erubis, an ERB implementation which also runs JavaScript: http://www.kuwata-lab.com/erubis/users-guide.04.html#lang-javascript
2018-06-01 09:24:32 +00:00
* DigitalBrainstem EJS Language support: https://github.com/Digitalbrainstem/ejs-grammar
2015-07-20 13:42:07 +00:00
## License
Licensed under the Apache License, Version 2.0
(<http://www.apache.org/licenses/LICENSE-2.0>)
- - -
EJS Embedded JavaScript templates copyright 2112
mde@fleegix.org.