Создание своих макросов — различия между версиями

Материал из DevelopmenOnTheEdge
Перейти к: навигация, поиск
(Новая страница: «<div>Официальная документация по созданию макросов Freemarker <a href="http://freemarker.org/docs/ref_directive_macro.htm…»)
 
Строка 1: Строка 1:
<div>Официальная документация по созданию макросов Freemarker <a href="http://freemarker.org/docs/ref_directive_macro.html" target="_blank">здесь</a>.<br>
+
Официальная документация по созданию макросов Freemarker [http://freemarker.org/docs/ref_directive_macro.html здесь].
<br>
+
 
</div>
+
Особенности при переходе с m4:
Особенности при переходе с m4:<br>
+
* Все параметры макроса обязательны кроме тех, которым дано значение по умолчанию. Если раньше у макроса второй параметр был необязателен и писали так:
* Все параметры макроса обязательны кроме тех, которым дано значение по умолчанию. Если раньше у макроса второй параметр был необязателен и писали так:<br>
+
 
<code>define(MY_MACRO, ... ifelse($2,,...))</code><br>
+
<code>define(MY_MACRO, ... ifelse($2,,...))</code>
теперь можно писать так:<br>
+
 
<code><#macro MY_MACRO requiredParameter optionalParameter=<nowiki>''</nowiki>>...<br>
+
теперь можно писать так:
  <#if optionalParameter==<nowiki>''</nowiki>>...<#else>...</#if>...<br>
+
 
</#macro></code>
+
<#macro MY_MACRO requiredParameter optionalParameter=<nowiki>''</nowiki>>...
* При вызове макроса можно именовать параметры для наглядности:<br>
+
  <#if optionalParameter==<nowiki>''</nowiki>>...<#else>...</#if>...
<code><@MY_MACRO requiredParameter='val1' optionalParameter='val2'/></code><br>
+
</#macro>
* Чтобы передать результат выполнения макроса в функцию (например, concat), надо присвоить этот результат в переменную с помощью <<a href="http://freemarker.org/docs/ref_directive_assign.html" target="_blank">#assign</a>>. Раньше писали:<br>
+
 
 +
* При вызове макроса можно именовать параметры для наглядности:
 +
<code><@MY_MACRO requiredParameter='val1' optionalParameter='val2'/></code>
 +
* Чтобы передать результат выполнения макроса в функцию (например, concat), надо присвоить этот результат в переменную с помощью <[http://freemarker.org/docs/ref_directive_assign.html #assign]>. Раньше писали:
 
<code>_DBMS_CONCAT( MYMACRO1(arg1), MYMACRO2(arg2) )</code><br>
 
<code>_DBMS_CONCAT( MYMACRO1(arg1), MYMACRO2(arg2) )</code><br>
 
Теперь так:<br>
 
Теперь так:<br>
<code><#assign result1><@MYMACRO1 arg1/></#assign></code><br>
+
<#assign result1><@MYMACRO1 arg1/></#assign>
<code><#assign result2><@MYMACRO2 arg2/></#assign></code><br>
+
<#assign result2><@MYMACRO2 arg2/></#assign>
<code>${concat(result1, result2)}</code><br>
+
${concat(result1, result2)}
В некоторых случаях лучше определять не макрос, а функцию с помощью директивы <<a href="http://freemarker.org/docs/ref_directive_function.html" target="_blank">#function</a>>. Тогда функцию можно будет использовать:<br>
+
В некоторых случаях лучше определять не макрос, а функцию с помощью директивы <[http://freemarker.org/docs/ref_directive_function.html #function]>. Тогда функцию можно будет использовать:
 
<code>${concat( func1(arg1), func2(arg2) )</code>
 
<code>${concat( func1(arg1), func2(arg2) )</code>
* Аргументы макроса не могут быть напрямую результатом выполнения другого макроса за исключением <#nested>-аргумента. Если у макроса один из аргументов предположительно может быть большим и нетривиальным или макрос по своей семантике его оборачивает, пользуйтесь <#nested>. Так сделан, например, предопределённый макрос <@bold/>:<br>
+
* Аргументы макроса не могут быть напрямую результатом выполнения другого макроса за исключением <#nested>-аргумента. Если у макроса один из аргументов предположительно может быть большим и нетривиальным или макрос по своей семантике его оборачивает, пользуйтесь <#nested>. Так сделан, например, предопределённый макрос <@bold/>:
<code><#macro bold></code><br>
+
<#macro bold>
<code>  <#assign nested><#nested></#assign></code><br>
+
  <#assign nested><#nested></#assign>
<code>  ${concat('<nowiki><b>'?str, nested, '</b></nowiki>'?str)}</code><br>
+
  ${concat('<nowiki><b>'?str, nested, '</b></nowiki>'?str)}
<code></#macro></code><br>
+
</#macro>
Пользоваться им в результате удобно и естественно:<br>
+
Пользоваться им в результате удобно и естественно:
 
<code><@bold><@italic>${concat('a', 'b')}</@></@></code>
 
<code><@bold><@italic>${concat('a', 'b')}</@></@></code>
 
* Если макрос не имеет параметров вообще, возможно, стоит присвоить его значение переменной. Так вместо<br>
 
* Если макрос не имеет параметров вообще, возможно, стоит присвоить его значение переменной. Так вместо<br>
<code><#macro USER_INFO></code><br>
+
<#macro USER_INFO>
<code>User: </code><br>
+
User:
<code>  ${concat('u.emailAddress', ' ('?str, <br>
+
  ${concat('u.emailAddress', ' ('?str,  
    'per.courtesy', ' '?str, <br>
+
    'per.courtesy', ' '?str,  
    'per.firstName', ' '?str, <br>
+
    'per.firstName', ' '?str,  
    'per.lastName', ', #'?str, <br>
+
    'per.lastName', ', #'?str,  
    'per.ID'?asVarchar, ')'?str)}</code><br>
+
    'per.ID'?asVarchar, ')'?str)}
<code></#macro></code><br>
+
</#macro>
Пишем:<br>
+
Пишем:
<code><#assign USER_INFO></code><br>
+
<#assign USER_INFO>
<code>User: </code><br>
+
User:  
<code>  ${concat('u.emailAddress', ' ('?str, <br>
+
  ${concat('u.emailAddress', ' ('?str,  
    'per.courtesy', ' '?str, <br>
+
    'per.courtesy', ' '?str,  
    'per.firstName', ' '?str, <br>
+
    'per.firstName', ' '?str,  
    'per.lastName', ', #'?str, <br>
+
    'per.lastName', ', #'?str,  
    'per.ID'?asVarchar, ')'?str)}</code><br>
+
    'per.ID'?asVarchar, ')'?str)}
<code></#</code><code><code>assign</code>><br>
+
</#assign>
</code>Тогда обращаться к USER_INFO можно в любом контексте по имени.<br>
+
Тогда обращаться к USER_INFO можно в любом контексте по имени.

Версия 16:09, 22 августа 2014

Официальная документация по созданию макросов Freemarker здесь.

Особенности при переходе с m4:

  • Все параметры макроса обязательны кроме тех, которым дано значение по умолчанию. Если раньше у макроса второй параметр был необязателен и писали так:

define(MY_MACRO, ... ifelse($2,,...))

теперь можно писать так:

<#macro MY_MACRO requiredParameter optionalParameter=''>...
  <#if optionalParameter==''>...<#else>...</#if>...
</#macro>
  • При вызове макроса можно именовать параметры для наглядности:

<@MY_MACRO requiredParameter='val1' optionalParameter='val2'/>

  • Чтобы передать результат выполнения макроса в функцию (например, concat), надо присвоить этот результат в переменную с помощью <#assign>. Раньше писали:

_DBMS_CONCAT( MYMACRO1(arg1), MYMACRO2(arg2) )
Теперь так:

<#assign result1><@MYMACRO1 arg1/></#assign>
<#assign result2><@MYMACRO2 arg2/></#assign>
${concat(result1, result2)}

В некоторых случаях лучше определять не макрос, а функцию с помощью директивы <#function>. Тогда функцию можно будет использовать: ${concat( func1(arg1), func2(arg2) )

  • Аргументы макроса не могут быть напрямую результатом выполнения другого макроса за исключением <#nested>-аргумента. Если у макроса один из аргументов предположительно может быть большим и нетривиальным или макрос по своей семантике его оборачивает, пользуйтесь <#nested>. Так сделан, например, предопределённый макрос <@bold/>:
<#macro bold>
  <#assign nested><#nested></#assign>
  ${concat('<b>'?str, nested, '</b>'?str)}
</#macro>

Пользоваться им в результате удобно и естественно: <@bold><@italic>${concat('a', 'b')}</@></@>

  • Если макрос не имеет параметров вообще, возможно, стоит присвоить его значение переменной. Так вместо
<#macro USER_INFO>
User:
  ${concat('u.emailAddress', ' ('?str, 
    'per.courtesy', ' '?str, 
    'per.firstName', ' '?str, 
    'per.lastName', ', #'?str, 
    'per.ID'?asVarchar, ')'?str)}
</#macro>

Пишем:

<#assign USER_INFO>
User: 
  ${concat('u.emailAddress', ' ('?str, 
    'per.courtesy', ' '?str, 
    'per.firstName', ' '?str, 
    'per.lastName', ', #'?str, 
    'per.ID'?asVarchar, ')'?str)}
</#assign>

Тогда обращаться к USER_INFO можно в любом контексте по имени.