Объявить внутреннюю переменную
<fest:set name="name">John</fest:set>
<fest:set name="full_name">
<fest:get name="name"/><fest:space/>F. Kennedy
</fest:set>
Для fest:set
можно использовать атрибут test
. Операция выполнится, если его значение (js-выражение) истинно.
<fest:set name="name" test="false">should not be set</fest:set>
Внутри fest:set
доступен контекст params
, передаваемый через fest:get
.
<fest:set name="line">
Hello,<fest:space/><fest:value>params.username</fest:value>
</fest:set>
<fest:get name="line">{username: "John"}</fest:get>
Получить переменную, объявленную через fest:set
<fest:get name="name"/>
<fest:get name="name">{'some': 'data'}</fest:get>
Добавить атрибуты к родительскому тегу. Все fest:attribute
должны быть внутри блока fest:attributes
, который должен быть первым внутри тега.
<fest:set name="link">http://mail.ru</fest:set>
<a>
<fest:attributes>
<fest:attribute name="href"><fest:get name="link"/></fest:attribute>
</fest:attributes>
Some link
</a>
Вывести значение js-выражения
<fest:value>json.value</fest:value>
<fest:value output="text"><![CDATA["<script/>"]]></fest:value>
<fest:value output="js">'"'</fest:value>
Вывод неформатированного текста
<fest:text>"Bla bla bla"</fest:text>
Пробел
Итерация по объекту
<fest:script>var itrerate = {"foo": "bar"}</fest:script>
<fest:for iterate="itrerate" index="i">
<fest:value>i</fest:value>=<fest:value>itrerate[i]</fest:value>
</fest:for>
Итерация по массиву или по числовому ряду
<fest:script>json.items = ['a', 'b', 'c']</fest:script>
<fest:foreach iterate="json.items" index="i">
<fest:value>json.items[i]</fest:value>
</fest:foreach>
<fest:foreach from="1" to="5" index="i">
<fest:value>i</fest:value>
</fest:foreach>
Условный оператор
<fest:if test="true">
true
</fest:if>
Ветвление. Если ни один fest:when
не выполнен, будет выбрана ветвь fest:otherwise
.
<fest:choose>
<fest:when test="1">
<fest:text>one</fest:text>
</fest:when>
<fest:when test="2">
<fest:text>two</fest:text>
</fest:when>
<fest:otherwise>
<fest:text>More than 2</fest:text>
</fest:otherwise>
</fest:choose>
Блок CDATA
<script>
<fest:cdata>
<![CDATA[alert ("2" < 3);]]>
</fest:cdata>
</script>
HTML комментарий
<fest:comment>comment</fest:comment>
Объявление doctype страницы
<fest:doctype>html</fest:doctype>
Выполнить javascript
<fest:script>
<![CDATA[
json.script = 2 < 3;
]]>
</fest:script>
<fest:script src="script.js"/>
Вставить содержимое другого шаблона с заданным контекстом.
<fest:script>json.list = ['a', 'b', 'c'];</fest:script>
<fest:include context="json.list" src="./include_foreach.xml"/>
Вставить файл напрямую в шаблон
<style type="text/css">
<fest:insert src="style.css"/>
<style>
var fest = require('../lib/fest');
var data = {name: 'Jack "The Ripper"'},
template = './templates/basic.xml';
var compiled = fest.compile(template, {beatify: false}),
template = (new Function('return ' + compiled))();
console.log(template(data));
basic.xml
<?xml version="1.0"?>
<fest:template xmlns:fest="http://fest.mail.ru" context_name="json">
<h1>Hello,<fest:space/><fest:value output="text">json.name</fest:value></h1>
<!-- По умолчанию все значения fest:value экранируются -->
<!--
Необходимо использовать fest:space или
fest:text для явного указания строк с пробелами
-->
</fest:template>
Результат
<h1>Hello, Jack "The Ripper"</h1>
Данные на вход
var data = {
people: [
{name: 'John', age: 20},
{name: 'Mary', age: 21},
{name: 'Gary', age: 55}
],
append: '>>'
}
foreach.xml (основной шаблон)
<?xml version="1.0"?>
<fest:template xmlns:fest="http://fest.mail.ru" context_name="json">
<!-- Контекст можно передавать во вложенные шаблоны -->
<fest:include context_name="json" src="./person.xml"/>
<!-- Значением iterate может быть любое js-выражение -->
<fest:foreach iterate="json.people.reverse()" index="i">
<!-- Передаваемые значения будут доступны в контексте params -->
<fest:get name="person">json.people[i]</fest:get>
</fest:foreach>
</fest:template>
person.xml
<?xml version="1.0"?>
<fest:template xmlns:fest="http://fest.mail.ru" context_name="json">
<!--
Используем set для объявления переменной,
которую используем в родительском шаблоне
-->
<fest:set name="person">
<p>
<fest:script><![CDATA[
var first = params.name[0],
other = params.name.slice(1);
]]></fest:script>
<fest:value>json.append</fest:value>
<strong>
<fest:value>first</fest:value>
</strong>
<fest:value>other</fest:value>
</p>
</fest:set>
</fest:template>
Результат
<p>>><strong>G</strong>ary</p>
<p>>><strong>M</strong>ary</p>
<p>>><strong>J</strong>ohn</p>
<?xml version="1.0"?>
<fest:template xmlns:fest="http://fest.mail.ru" context_name="json">
<fest:set name="host">http://e.mail.ru</fest:set>
<fest:set name="all">msglist</fest:set>
<fest:set name="new">sentmsg?compose</fest:set>
<fest:set name="all_link">
<fest:get name="host"/>/<fest:get name="all"/>
</fest:set>
<fest:set name="new_link">
<fest:get name="host"/>/<fest:get name="new"/>
</fest:set>
<ul>
<!-- fest:attribute добавляет параметр к родительскому тегу -->
<li><a>
<fest:attributes>
<fest:attribute name="href"><fest:get name="all_link"/></fest:attribute>
</fest:attributes>
Все сообщения
</a></li>
<li><a>
<fest:attributes>
<fest:attribute name="href"><fest:get name="new_link"/></fest:attribute>
</fest:attributes>
Написать письмо
</a></li>
</ul>
</fest:template>
Результат
<ul>
<li><a href="http://e.mail.ru/msglist">Все сообщения</a></li>
<li><a href="http://e.mail.ru/sentmsg?compose">Написать письмо</a></li>
</ul>