转发 output_format 到包含的模板

Forward output_format to included templates

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

基本上,我有两套模板:

  1. 通用模板,集中了一些文本块,我非常想将它们集中在一个文件中。

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

到目前为止,我没有使用 ftlx/ftlh 自动转义模式 - 每个模板都是一个 "normal" ftl 文件。由于我的输出格式可能是 XMLs 等。我在我的输出格式模板的 ftl 指令中设置了 output_format="XML" 等,这些模板旨在生成 XML.

不幸的是,output_format 仅对当前模板有效,对包含的模板无效,这会导致未转义的特殊字符(常见的嫌疑人,如 <& 等。 ) 在我渲染的 XML 中。另一方面,这种行为很有意义,因为包含的模板可能会声明自己的 output_format.

有什么方法可以转义包含的模板或覆盖包含的模板的 output_format 吗?或者我是否必须为任何目标转义模式(XMLHTML、纯文本等)复制所有文本块模板?

非常感谢!

模板中某个部分的输出格式在模板解析时(不是稍后,执行时)决定并固定,因此不能动态分配。模板是 #include-d 还是主模板都没有关系。所以,如果你在包含的 "textblock templates" 中有插值,那么你肯定会遇到问题。如果那里没有插值,那么它并不重要,因为静态文本无论如何都不会转义。

假设您在 "textblock templates" 中进行了插值。一种(公认的笨拙)解决方法是对这些模板使用 "undefined" 输出格式,然后在其中使用遗留 #escape 之类的 #escape x as esc(x),其中 esc 是转义函数使用,您动态分配。 (Functions/methods 是 FTL 中的第一个 class 值,因此您可以将它们分配给变量。因此您可以发出 <#assign esc = someEscapingFunction>,然后 #include 模板。)当然你会想要创建一些宏和函数以使此操作易于管理。就像你创建一个名为 setDynamicOutputFormat 的宏,它以某种方式根据其参数输出格式设置所述 esc 变量,然后你启动一个典型的模板,如下所示:<#ftl outputFormat='HTML'><@setDynamicOutputFormat .outputFormat />。然后当你 #include 东西时,#escape x as esc(x) 将在其中正常工作。