Nov 25, 2015

Syntax for the DOCX / PPTX templating feature

The syntax is highly inspired by Mustache. The template is created in Microsoft Word/PowerPoint or any equivalent that saves to DOCX/PPTX. Also checkout this example of using the templating feature.

Synopsis

A typical DOCX template:

Hello {name} !

Given the following value for the templating JSON dictionary:

{ name:'Edgar'}

Will produce:

Hello Edgar !

Tag types

Like Mustache, it has the loopopening {#} and loopclosing {/} brackets

Loop syntax

The following template:

{#products}
    {name}, {price} €
{/products}

Given the following JSON dictionary:

{
    "products":
        [
         {name:"Windows",price:100},
         {name:"Mac OSX",price:200},
         {name:"Ubuntu",price:0}
        ]
}

will result in :

Windows, 100 €
Mac OSX, 200 €
Ubuntu, 0 €

The loop behaves in the following way:

  • If the value is an array, it will loop over all the elements of that array.
  • If the value is a boolean, it will loop once if the value is true, keeping the same scope, and not loop at all if the value is false

Note: Because the loops work also with boolean values, you can also use them for conditions.


Raw XML syntax

Sometimes, you would like to insert your custom XML (a complex table, a formula, ...)

With the RawXML syntax the variable is interpreted as XML and replaced in the formula

{@rawXML}

with this data:

{rawXml:'<w:p><w:pPr><w:rPr><w:color w:val="FF0000"/></w:rPr></w:pPr><w:r><w:rPr><w:color w:val="FF0000"/></w:rPr><w:t>My custom</w:t></w:r><w:r><w:rPr><w:color w:val="00FF00"/></w:rPr><w:t>XML</w:t></w:r></w:p>'}

This will loop over the first parent tag

Inverted Selections

An inverted section begins with a caret (hat) and ends with a slash. That is {^person} begins a "person" inverted section while {/person} ends it.

While sections can be used to render text one or more times based on the value of the key, inverted sections may render text once based on the inverse value of the key. That is, they will be rendered if the key doesn't exist, is false, or is an empty list.

Template:

{#repo}
  <b>{name}</b>
{/repo}
{^repo}
  No repos 🙁
{/repo}

Value for the templating JSON dictionary:

{
  "repo": []
}

Output:

No repos :(