GSP
*****
В качестве шаблонов для генерации текста используется формат ``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*/`` *(коментарий)*
* ```` преобразуется в ``outTag('xx/yy')`` *(вызов функции outTag)*
* ```` преобразуется в ``outTag('xx/yy',atr:value,atr2:value)`` *(вызов функции outTag)*
* `` body `` преобразуется в ``outTag('xx/yy',atr:value,atr2:value) { body }`` *(вызов функции outTag)*
Локальные переменные в шаблоне
==============================
Шаблон преобразуется в текст метода groovy. Соотвественно любое определение переменной
определяет локальную переменную метода:
.. code-block:: jsp
<%
// локальные переменные метода шаблона
String s = ""
def a = []
%>
Для определения функций внутри шаблона изпользуются ``groovy closure`` (т.к. метод внутри метода
объявить нельзя):
.. code-block:: jsp
<%
def pw2 = {a->
return a*a
}
%>
5^2 = ${pw2(5)}