В качестве шаблонов для генерации текста используется формат gsp.
Синтаксис совпадает с оригинальным gsp (Groovy Server Pages) из проекта http://grails.org
для обеспечения нормального редактирования в IDE, которые поддерживают gsp.
Особенности сгенерированного по шаблону класса:
- каждая строка внутри метода совпадает со строкой в шаблоне, что позволяет однозначно идентифицировать место возникновения ошибки в шаблоне (в отличии от оригинального gsp, где нет соответсвия между сгенерированным классом и оригинальным шаблоном)
- базовый класс должен реализовывать интерфейс
jandcode.groovy.IGspTemplate
Парзер gsp просто преобразует текст шаблона в текст на groovy по следующим правилам:
ANYTEXTпреобразуется вout('ANYTEXT')(вывести фрагмент текста)${ANYTEXT}преобразуется вout(ANYTEXT)(вывести значение выражения)<%ANYTEXT%>преобразуется вANYTEXT(вставить фрагмент groovy-кода)<%=ANYTEXT%>преобразуется вout(ANYTEXT)(вывести значение выражения)<%--ANYTEXT--%>преобразуется в/*ANYTEXT*/(коментарий)%{--ANYTEXT--}%преобразуется в/*ANYTEXT*/(коментарий)<xx:yy/>преобразуется вoutTag('xx/yy')(вызов функции outTag)<xx:yy atr="value" atr2="value2"/>преобразуется вoutTag('xx/yy',atr:value,atr2:value)(вызов функции outTag)<xx:yy atr="value" atr2="value2"> body </xx:yy>преобразуется вoutTag('xx/yy',atr:value,atr2:value) { body }(вызов функции outTag)
Шаблон преобразуется в текст метода groovy. Соотвественно любое определение переменной определяет локальную переменную метода:
<%
// локальные переменные метода шаблона
String s = ""
def a = []
%>
Для определения функций внутри шаблона изпользуются groovy closure (т.к. метод внутри метода
объявить нельзя):
<%
def pw2 = {a->
return a*a
}
%>
5^2 = ${pw2(5)}