巨集在模板中以 <#macro name> 定義,調用時用 <@name> (以 @ 取代 #)。
<#macro greet person color="black">
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
<@greet person="Fred"/>
<@greet person="Batman" color="red"/>
<#nested><#macro border>
<div class="border"><#nested></div>
</#macro>
<@border>被框起的文字</@border>
<#nested> 可多次呼叫,實現重複輸出。
<#macro repeat count>
<#list 1..count as x>
<#nested x, x/2, x==count>
</#list>
</#macro>
<@repeat count=4 ; c, half, last>
${c}. ${half}<#if last> Last!</#if>
</@repeat>
| 類型 | 指令 | 作用域 | 備註 |
|---|---|---|---|
| Plain | assign | 全域 (含 include) | 預設 |
| Local | local | 巨集定義內部 | 遮蔽同名 plain |
| Loop | 指令自動建立 | 巢狀內容 | 遮蔽 local 與 plain |
<#assign x = "plain"> ${x} <!-- plain -->
<#macro test>
${x} <!-- plain -->
<#local x = "local"> ${x} <!-- local -->
<#list ["loop"] as x> ${x} <!-- loop --></#list>
${x} <!-- local -->
</#macro>
<@test/>
${x} <!-- plain -->
存取資料模型同名變數用 .globals.var。
防止巨集/變數命名衝突,建立可複用函式庫。
<!-- lib/my_test.ftl -->
<#macro copyright date>
Copyright (C) ${date} Julia Smith. <br> Email: ${mail}
</#macro>
<#assign mail = "JSmith@acme.com">
<#import "/lib/my_test.ftl" as my>
<@my.copyright date="1999-2002"/>
${my.mail} <!-- JSmith@acme.com -->
<#assign mail="fred@acme.com" in my>
${my.mail} <!-- JSmith@other.com -->
資料模型變數跨命名空間可見,庫內可直接引用 ${user} 等。
四篇指南涵蓋 FreeMarker 核心語法、資料模型、指令/表達式/插值、巨集與命名空間,足以應對實戰模板開發需求。