将output_format转发到包含的模板

时间:2017-08-07 13:03:04

标签: freemarker

我遇到了freemarker模板的一个小问题 - 或者更有可能是我的设置。

基本上,我有两套模板:

  1. 常用模板,集中了一些我非常希望集中在一个文件中的文本块。

  2. 输出格式,可生成HTMLXML,纯文本等,并且可能包含一些常见的文本块。

  3. 到目前为止,我没有使用ftlx / ftlh自动转义模式 - 每个模板都是“普通”ftl文件。由于我的输出格式可能是XML等,我在我的输出格式模板的output_format="XML"指令中设置ftl等,以便生成XML。< / p>

    不幸的是,output_format仅对当前模板有效,而不适用于所包含的模板,这会导致未转义的特殊字符(<&等常见嫌疑人)我呈现的XML。另一方面,这种行为非常有意义,因为包含的模板可能会声明自己的output_format

    有没有办法逃脱包含的模板或覆盖output_format包含的模板?或者我是否必须复制所有目标转义模式(XMLHTML,纯文本等)的文本块模板?

    非常感谢提前!

1 个答案:

答案 0 :(得分:0)

模板中某个部分的输出格式已经确定,并且在解析模板时(不是以后,当它被执行时)变得固定,因此无法动态分配。如果模板是#include - d或它是主模板,则不会生成任何内容。因此,如果您在包含的&#34;文本块模板&#34;中进行了插值,那么您肯定会遇到问题。如果那里没有插值,那么它就不会进行插补,因为静态文本无论如何都不会被转义。

我们假设您在那些&#34;文本块模板&#34;中进行了插值。一个(公认的尴尬)解决方法可能是使用&#34; undefined&#34;这些模板的输出格式,然后在其中使用#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)将在其中正常运作。