DOMtempl

HTML templating that brings you peace

Documentation - General

Each DOMtempl template is a valid HTML document.

Elements might have special attributes, that control their templating behavior:

    <a data-COMMAND="VARref"></a>
 

Where VARref points to a variable with actual data, and COMMAND might be one of the following:

data-* attributes

DOMtempl reserves the following HTML5 data attributes:

data-each
The element will be repeated multiple times; the specified variable will be treated as an array and iterated over.
data-when
The element will/will not be rendered according to truthness of specified variable.
data-var
Contents of the element will be replaced with specified variable.
data-attr-NAME
Contents of the NAME attribute will be replaced with specified variable.
data-same
The element is part of the same data-each group as the specified variable is.
data-from
Selects variable scope for children elements.

Note, that data-each and data-when change the scope for all children elements.

VARref

VARref is a string that can describe relative variable position in a JSON-like data structure. It is a bit similar to XPath, although magnitudes simpler (it can't filter or search or group or map or reduce).

Path elements are allowed to contain any characters, except ., / and *.

Whitespace in path elements is not recommended, but allowed.

The . and / symbols are used for concatenating path elements.

For direct descendants of a variable, . is used.

"person": {
    "name": "Barry Allen",
    "age": 25,
}
 
person.name = "Barry Allen"
person.age = 25
 

For all possible children (when iterating over an array), / should be used instead.

"persons": [
    { "name": "John Doe", "age": 25 },
    { "name": "Jack Smith", "age": 32 },
]
 
persons/name = "John Doe", "Jack Smith"
persons/age = 25, 32
 

All VARrefs are relative to their parent elements, unless they start with /.

Accessing current iterator value could be done by appending / to the end.

"fruit": [ "apple", "orange", "banana" ]
"dict": {
    speed: "high",
    voltage: "low"
}
 
fruit/ = "apple", "orange", "banana"
dict/ = "high", "low"
 

Accessing current iterator key could be done by appending the * asterix symbol to the end of the VARref.

"fruit": [ "apple", "orange", "banana" ]
"dict": {
    speed: "high",
    voltage: "low"
}
 
fruit/* = 0, 1, 2
dict/* = "speed", "voltage"
 

Compare to JSONpath:

 //sample data:
    "foo" : { "bar" : "value" },
    "fruit" : [ "apple", "orange", "banana" ],
    "book" : [
            { "author" : "J.K. Rowling", "title" : "Harry Potter" },
            { "author" : "P.K. Dick", "title" : "Minority Report" }
        ]
 
JSONpath VARref Gives you
['foo'] foo { "bar": "value" }
['foo']['bar'] foo.bar "value"
['fruit'][0] fruit.0 "apple"
['fruit'][*] fruit/ [ "apple", "orange", "banana" ]
['book'][*]['author'] book/author [ "J.K. Rowling", "P.K. Dick" ]
book/* [ "author", "title" ]

Scope

By default, all VARrefs are relative to the closest parent element with a data-when, data-each or data-from attributes. Here

    <div data-when="foo">
        <span data-var="bar"></span>
    </div>
 

SPAN element's data-var points to foo.bar variable.

It only happens for child elements, so to access nested variable in the same element, you still have to use current scope:

    <div data-when="foo" data-var="foo.bar"></div>
 

To break free of deep nested scope, '/' can be used:

    <div data-when="foo">
        <span data-var="bar"></span>
        <p data-var="/moo"></p>
    </div>
 

P element will reference "moo" and not "foo.moo"

Scope can also be changed without any other actions by using data-from attribute:

    <div data-from="person.0">
        <span data-var="name"></span>
    </div>