Project

ejx

0.0
The project is in a healthy, maintained state
Compile EJX (Embedded JavaScript) templates to Javascript with Ruby.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

 Project Readme

EJX (Embedded JavaScript) template compiler for Ruby

EJX templates embed JavaScript code inside <% ... %> tags, much like ERB. This library is inspired by Underscore.js's _.template function and JSX, but without the virtual DOM.

The EJX tag syntax is as follows:

  • <% ... %> silently evaluates the statement inside the tags.
  • <%= ... %> evaluates the expression inside the tags, escapes and inserts it into the template output.
  • <%- ... %> behaves like <%= ... %> but does not escape it's output.
  • self references the template function

The functions compiled with EJX will return an array containing Node objects and/or DOMString which can be appended to a Node via Node.append(...)

Examples

To compile an EJX template into a Javascript module pass the template to EJX.compile:

    EJX.compile("Hello <span><%= name %></span>")
    # => import {append as __ejx_append} from 'ejx';
    # => 
    # => export default async function self (locals) {
    # =>     var __output = [], __promises = [];
    # => 
    # =>     __output.push("Hello ");
    # =>     var __a = document.createElement("span");
    # =>     __ejx_append(name, __a, true, __promises);
    # =>     __ejx_append(__a, __output, false, __promises);
    # => 
    # =>     await Promise.all(__promises);
    # =>     return __output;
    # => }
    JS

If a evalation tag (<%= or <%-) ends with an opening of a function, the function returns a compiled template. For example:

<%  formTag = function(template) {
        var a = document.createElement("form");
        a.append.apply(a, template());
        return a;
    } %>

<%= formTag(function () { %>
  <input type="submit" />
<% }) %>

generates:

import {append as __ejx_append} from 'ejx';

export default async function self (locals) {
    var __output = [], __promises = [];
  
    formTag = function(template) {
        var a = document.createElement("form");
        a.append.apply(a, template());
        return a;
    }
    var __a = [];
    __ejx_append(formTag(function () {
        var __b = document.createElement("input");
        __b.setAttribute("type", "submit");
        __ejx_append(__b, __a, false, __promises);
    }), __output, true, __promises, __a);

    await Promise.all(__promises);
    return __output;
}