2017-08-07 103 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)将在其中正常工作。