调用方法:
①<@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN/> (xml风格)
②<@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN ;lv1, lv2, ..., lvN/> (包含循环变量)
③<@user_def_dir_exp ...>...</@user_def_dir_exp>(使用结束标签1)
④<@user_def_dir_exp ...>...</@>(使用结束标签2)
说明:
- user_def_dir_exp:表达式算作是自定义指令(比如宏),将会被调用。
- param1,param2 等:参数的名称,它们不是表达式。
- val1,val2 等:参数的值,它们是表达式。
- lv1,lv2 等:循环变量的名称,它们不是表达式。
参数的数量可以是 0(也就是没有参数)。参数的顺序并不重要(除非你使用了位置参数传递)。参数名称必须唯一。在参数名中小写和大写的字母被认为是不同的字母(也就是 Color 和 color 是不同的)。
调用有参数的宏:
<@list items=["mouse", "elephant", "python"] title="Animals"/> ... <#macro list title items> <p>${title?cap_first}: <ul> <#list items as x> <li>${x?cap_first} </#list> </ul> </#macro>
结束标签:
你可以在结束标签中忽略 user_def_dir_exp 。也就是说,你可以写 </@> 来替代</@anything> 。这个规则当表达式 user_def_dir_exp 太复杂时非常有用,因为你不需要在结束标签中重复表达式。
位置参数传递:
位置参数传递(如 <@heading "Preface", 1/> )是正常命名参数传递(如<@heading title="Preface" level=1/> )的速记形式,这里忽略了参数的名称。如果自定义指令只有一个参数,或者对于经常使用的自定义指令它参数的顺序很好记忆,速记形式应该被应用。如果你使用参数名称,那顺序就不重要了。
循环变量:
自定义指令创建循环变量(和 list 指令相似)。当你调用指令(如 <#list foos as foo>...</#list> 中的 foo )时循环变量的名称就给定了,而变量的值是由指令本身设置的。在自定义指令的情形下,语法是循环变量的名称在分号之后给定。
<#macro repeat count> <#list 1..count as x> <#nested x, x/2, x==count> </#list> </#macro> <@repeat count=4 ; c, halfc, last> ${c}. ${halfc}<#if last> Last!</#if> </@repeate> <@repeat count=4 ; x, last> ${x}. Something... <#if last> This was the last!</#if>
注意由自定义指令创建的循环变量数量和分号之后指定的循环变量数量需要不匹配。也就是说,如果你对重复是否是最后一个不感兴趣,你可以简单来写:
<@repate count=4 ; x> ${x}. Something... </@repate >
或者 <@repeat count=4> Something... </@repeat >