2017-08-07 104 views
0

我遇到了freemarker模板的一個小問題 - 或者更可能是我的設置。轉發output_format到包含的模板

基本上,我有兩套模板:

  1. 通用模板,即集中一些的TextBlocks,我非常想保持在每一個單一的文件集中。

  2. 輸出格式,產生HTML,XML,明文等,並可能包括一些常見的文本塊。

到目前爲止,我沒有使用ftlx/ftlh自動逃逸模式 - 每一個模板是一種「正常」 ftl文件。由於我的輸出格式可能是XML s等,所以我在我的輸出格式模板的ftl指令中設置了output_format="XML"等,這些指令旨在生成XML

不幸的是,output_format僅適用於當前模板,而不是所包含的模板,從而導致轉義特殊字符(秋後算賬一樣<&等)在我的渲染XML。另一方面,這種行爲非常有意義,因爲包含的模板可能會聲明自己的output_format

有沒有什麼辦法逃避包含的模板或覆蓋output_format爲包含的模板?或者我將不得不復制所有有針對性的轉義模式的文本塊模板(XML,HTML,Plaintext等)?

非常感謝提前!

回答

0

模板中的某個部分的輸出格式是決定的,並且在模板被解析時變得固定(不再後來執行),所以不能動態分配。如果模板是#include-d或者它是主模板,則它並不重要。所以,如果你在包含的「文本塊模板」中插入內容,那麼你肯定會遇到問題。如果在那裏沒有插值,那麼它並不重要,因爲靜態文本永遠不會被轉義。

假設您在這些「文本塊模板」中有插值。其中一個(無可否認的)解決方法是對這些模板使用「undefined」輸出格式,然後在其中使用傳統#escape,如#escape x as esc(x),其中esc是您要動態使用的轉義函數。 (函數/方法是FTL中的第一類值,因此您可以將它們分配給變量,因此您可以發出<#assign esc = someEscapingFunction>,然後#include模板。)當然,您需要創建一些宏和函數來完成此可管理操作。就像你創建一個名爲setDynamicOutputFormat的宏,它以某種方式根據其參數輸出格式設置了所述esc變量,然後啓動一個典型的模板,如下所示:<#ftl outputFormat='HTML'><@setDynamicOutputFormat .outputFormat />。那麼當你#include的東西,#escape x as esc(x)將在其中正常工作。