twitst4tz

twitter statistics web application
Log | Files | Refs | README | LICENSE

README.md (9683B)


      1 # EJS
      2 
      3 Embedded JavaScript templates
      4 
      5 [![Build Status](https://img.shields.io/travis/mde/ejs/master.svg?style=flat)](https://travis-ci.org/mde/ejs)
      6 [![Developing Dependencies](https://img.shields.io/david/dev/mde/ejs.svg?style=flat)](https://david-dm.org/mde/ejs?type=dev)
      7 [![Known Vulnerabilities](https://snyk.io/test/npm/ejs/badge.svg?style=flat)](https://snyk.io/test/npm/ejs)
      8 
      9 ## Installation
     10 
     11 ```bash
     12 $ npm install ejs
     13 ```
     14 
     15 ## Features
     16 
     17   * Control flow with `<% %>`
     18   * Escaped output with `<%= %>` (escape function configurable)
     19   * Unescaped raw output with `<%- %>`
     20   * Newline-trim mode ('newline slurping') with `-%>` ending tag
     21   * Whitespace-trim mode (slurp all whitespace) for control flow with `<%_ _%>`
     22   * Custom delimiters (e.g., use `<? ?>` instead of `<% %>`)
     23   * Includes
     24   * Client-side support
     25   * Static caching of intermediate JavaScript
     26   * Static caching of templates
     27   * Complies with the [Express](http://expressjs.com) view system
     28 
     29 ## Example
     30 
     31 ```ejs
     32 <% if (user) { %>
     33   <h2><%= user.name %></h2>
     34 <% } %>
     35 ```
     36 
     37 Try EJS online at: https://ionicabizau.github.io/ejs-playground/.
     38 
     39 ## Usage
     40 
     41 ```javascript
     42 let template = ejs.compile(str, options);
     43 template(data);
     44 // => Rendered HTML string
     45 
     46 ejs.render(str, data, options);
     47 // => Rendered HTML string
     48 
     49 ejs.renderFile(filename, data, options, function(err, str){
     50     // str => Rendered HTML string
     51 });
     52 ```
     53 
     54 It is also possible to use `ejs.render(dataAndOptions);` where you pass
     55 everything in a single object. In that case, you'll end up with local variables
     56 for all the passed options. However, be aware that your code could break if we
     57 add an option with the same name as one of your data object's properties.
     58 Therefore, we do not recommend using this shortcut.
     59 
     60 ## Options
     61 
     62   - `cache`                 Compiled functions are cached, requires `filename`
     63   - `filename`              The name of the file being rendered. Not required if you
     64     are using `renderFile()`. Used by `cache` to key caches, and for includes.
     65   - `root`                  Set project root for includes with an absolute path (/file.ejs).
     66   - `context`               Function execution context
     67   - `compileDebug`          When `false` no debug instrumentation is compiled
     68   - `client`                When `true`, compiles a function that can be rendered
     69     in the browser without needing to load the EJS Runtime
     70     ([ejs.min.js](https://github.com/mde/ejs/releases/latest)).
     71   - `delimiter`             Character to use with angle brackets for open/close
     72   - `debug`                 Output generated function body
     73   - `strict`                When set to `true`, generated function is in strict mode
     74   - `_with`                 Whether or not to use `with() {}` constructs. If `false`
     75     then the locals will be stored in the `locals` object. Set to `false` in strict mode.
     76   - `destructuredLocals`    An array of local variables that are always destructured from
     77     the locals object, available even in strict mode.
     78   - `localsName`            Name to use for the object storing local variables when not using
     79     `with` Defaults to `locals`
     80   - `rmWhitespace`          Remove all safe-to-remove whitespace, including leading
     81     and trailing whitespace. It also enables a safer version of `-%>` line
     82     slurping for all scriptlet tags (it does not strip new lines of tags in
     83     the middle of a line).
     84   - `escape`                The escaping function used with `<%=` construct. It is
     85     used in rendering and is `.toString()`ed in the generation of client functions.
     86     (By default escapes XML).
     87   - `outputFunctionName`    Set to a string (e.g., 'echo' or 'print') for a function to print
     88     output inside scriptlet tags.
     89   - `async`                 When `true`, EJS will use an async function for rendering. (Depends
     90     on async/await support in the JS runtime.
     91 
     92 This project uses [JSDoc](http://usejsdoc.org/). For the full public API
     93 documentation, clone the repository and run `npm run doc`. This will run JSDoc
     94 with the proper options and output the documentation to `out/`. If you want
     95 the both the public & private API docs, run `npm run devdoc` instead.
     96 
     97 ## Tags
     98 
     99   - `<%`              'Scriptlet' tag, for control-flow, no output
    100   - `<%_`             'Whitespace Slurping' Scriptlet tag, strips all whitespace before it
    101   - `<%=`             Outputs the value into the template (escaped)
    102   - `<%-`             Outputs the unescaped value into the template
    103   - `<%#`             Comment tag, no execution, no output
    104   - `<%%`             Outputs a literal '<%'
    105   - `%%>`             Outputs a literal '%>'
    106   - `%>`              Plain ending tag
    107   - `-%>`             Trim-mode ('newline slurp') tag, trims following newline
    108   - `_%>`             'Whitespace Slurping' ending tag, removes all whitespace after it
    109 
    110 For the full syntax documentation, please see [docs/syntax.md](https://github.com/mde/ejs/blob/master/docs/syntax.md).
    111 
    112 ## Includes
    113 
    114 Includes either have to be an absolute path, or, if not, are assumed as
    115 relative to the template with the `include` call. For example if you are
    116 including `./views/user/show.ejs` from `./views/users.ejs` you would
    117 use `<%- include('user/show') %>`.
    118 
    119 You must specify the `filename` option for the template with the `include`
    120 call unless you are using `renderFile()`.
    121 
    122 You'll likely want to use the raw output tag (`<%-`) with your include to avoid
    123 double-escaping the HTML output.
    124 
    125 ```ejs
    126 <ul>
    127   <% users.forEach(function(user){ %>
    128     <%- include('user/show', {user: user}) %>
    129   <% }); %>
    130 </ul>
    131 ```
    132 
    133 Includes are inserted at runtime, so you can use variables for the path in the
    134 `include` call (for example `<%- include(somePath) %>`). Variables in your
    135 top-level data object are available to all your includes, but local variables
    136 need to be passed down.
    137 
    138 NOTE: Include preprocessor directives (`<% include user/show %>`) are
    139 still supported.
    140 
    141 ## Custom delimiters
    142 
    143 Custom delimiters can be applied on a per-template basis, or globally:
    144 
    145 ```javascript
    146 let ejs = require('ejs'),
    147     users = ['geddy', 'neil', 'alex'];
    148 
    149 // Just one template
    150 ejs.render('<?= users.join(" | "); ?>', {users: users}, {delimiter: '?'});
    151 // => 'geddy | neil | alex'
    152 
    153 // Or globally
    154 ejs.delimiter = '$';
    155 ejs.render('<$= users.join(" | "); $>', {users: users});
    156 // => 'geddy | neil | alex'
    157 ```
    158 
    159 ## Caching
    160 
    161 EJS ships with a basic in-process cache for caching the intermediate JavaScript
    162 functions used to render templates. It's easy to plug in LRU caching using
    163 Node's `lru-cache` library:
    164 
    165 ```javascript
    166 let ejs = require('ejs'),
    167     LRU = require('lru-cache');
    168 ejs.cache = LRU(100); // LRU cache with 100-item limit
    169 ```
    170 
    171 If you want to clear the EJS cache, call `ejs.clearCache`. If you're using the
    172 LRU cache and need a different limit, simple reset `ejs.cache` to a new instance
    173 of the LRU.
    174 
    175 ## Custom file loader
    176 
    177 The default file loader is `fs.readFileSync`, if you want to customize it, you can set ejs.fileLoader.
    178 
    179 ```javascript
    180 let ejs = require('ejs');
    181 let myFileLoad = function (filePath) {
    182   return 'myFileLoad: ' + fs.readFileSync(filePath);
    183 };
    184 
    185 ejs.fileLoader = myFileLoad;
    186 ```
    187 
    188 With this feature, you can preprocess the template before reading it.
    189 
    190 ## Layouts
    191 
    192 EJS does not specifically support blocks, but layouts can be implemented by
    193 including headers and footers, like so:
    194 
    195 
    196 ```ejs
    197 <%- include('header') -%>
    198 <h1>
    199   Title
    200 </h1>
    201 <p>
    202   My page
    203 </p>
    204 <%- include('footer') -%>
    205 ```
    206 
    207 ## Client-side support
    208 
    209 Go to the [Latest Release](https://github.com/mde/ejs/releases/latest), download
    210 `./ejs.js` or `./ejs.min.js`. Alternately, you can compile it yourself by cloning
    211 the repository and running `jake build` (or `$(npm bin)/jake build` if jake is
    212 not installed globally).
    213 
    214 Include one of these files on your page, and `ejs` should be available globally.
    215 
    216 ### Example
    217 
    218 ```html
    219 <div id="output"></div>
    220 <script src="ejs.min.js"></script>
    221 <script>
    222   let people = ['geddy', 'neil', 'alex'],
    223       html = ejs.render('<%= people.join(", "); %>', {people: people});
    224   // With jQuery:
    225   $('#output').html(html);
    226   // Vanilla JS:
    227   document.getElementById('output').innerHTML = html;
    228 </script>
    229 ```
    230 
    231 ### Caveats
    232 
    233 Most of EJS will work as expected; however, there are a few things to note:
    234 
    235 1. Obviously, since you do not have access to the filesystem, `ejs.renderFile()` won't work.
    236 2. For the same reason, `include`s do not work unless you use an `include callback`. Here is an example:
    237   ```javascript
    238   let str = "Hello <%= include('file', {person: 'John'}); %>",
    239       fn = ejs.compile(str, {client: true});
    240 
    241   fn(data, null, function(path, d){ // include callback
    242     // path -> 'file'
    243     // d -> {person: 'John'}
    244     // Put your code here
    245     // Return the contents of file as a string
    246   }); // returns rendered string
    247   ```
    248 
    249 See the [examples folder](https://github.com/mde/ejs/tree/master/examples) for more details.
    250 
    251 ### IDE Integration with Syntax Highlighting
    252 
    253 VSCode:Javascript EJS by *DigitalBrainstem*
    254 
    255 ## Related projects
    256 
    257 There are a number of implementations of EJS:
    258 
    259  * TJ's implementation, the v1 of this library: https://github.com/tj/ejs
    260  * Jupiter Consulting's EJS: http://www.embeddedjs.com/
    261  * EJS Embedded JavaScript Framework on Google Code: https://code.google.com/p/embeddedjavascript/
    262  * Sam Stephenson's Ruby implementation: https://rubygems.org/gems/ejs
    263  * Erubis, an ERB implementation which also runs JavaScript: http://www.kuwata-lab.com/erubis/users-guide.04.html#lang-javascript
    264  * DigitalBrainstem EJS Language support: https://github.com/Digitalbrainstem/ejs-grammar
    265 
    266 ## License
    267 
    268 Licensed under the Apache License, Version 2.0
    269 (<http://www.apache.org/licenses/LICENSE-2.0>)
    270 
    271 - - -
    272 EJS Embedded JavaScript templates copyright 2112
    273 mde@fleegix.org.