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