转发 output_format 到包含的模板
Forward output_format to included templates
我 运行 遇到了 freemarker 模板的小问题 - 或者更可能是我的设置。
基本上,我有两套模板:
通用模板,集中了一些文本块,我非常想将它们集中在一个文件中。
输出格式,产生 HTML
、XML
、纯文本等,并且可能包括一些常见的文本块。
到目前为止,我没有使用 ftlx
/ftlh
自动转义模式 - 每个模板都是一个 "normal" ftl
文件。由于我的输出格式可能是 XML
s 等。我在我的输出格式模板的 ftl
指令中设置了 output_format="XML"
等,这些模板旨在生成 XML
.
不幸的是,output_format
仅对当前模板有效,对包含的模板无效,这会导致未转义的特殊字符(常见的嫌疑人,如 <
、&
等。 ) 在我渲染的 XML
中。另一方面,这种行为很有意义,因为包含的模板可能会声明自己的 output_format
.
有什么方法可以转义包含的模板或覆盖包含的模板的 output_format
吗?或者我是否必须为任何目标转义模式(XML
、HTML
、纯文本等)复制所有文本块模板?
非常感谢!
模板中某个部分的输出格式在模板解析时(不是稍后,执行时)决定并固定,因此不能动态分配。模板是 #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)
将在其中正常工作。
我 运行 遇到了 freemarker 模板的小问题 - 或者更可能是我的设置。
基本上,我有两套模板:
通用模板,集中了一些文本块,我非常想将它们集中在一个文件中。
输出格式,产生
HTML
、XML
、纯文本等,并且可能包括一些常见的文本块。
到目前为止,我没有使用 ftlx
/ftlh
自动转义模式 - 每个模板都是一个 "normal" ftl
文件。由于我的输出格式可能是 XML
s 等。我在我的输出格式模板的 ftl
指令中设置了 output_format="XML"
等,这些模板旨在生成 XML
.
不幸的是,output_format
仅对当前模板有效,对包含的模板无效,这会导致未转义的特殊字符(常见的嫌疑人,如 <
、&
等。 ) 在我渲染的 XML
中。另一方面,这种行为很有意义,因为包含的模板可能会声明自己的 output_format
.
有什么方法可以转义包含的模板或覆盖包含的模板的 output_format
吗?或者我是否必须为任何目标转义模式(XML
、HTML
、纯文本等)复制所有文本块模板?
非常感谢!
模板中某个部分的输出格式在模板解析时(不是稍后,执行时)决定并固定,因此不能动态分配。模板是 #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)
将在其中正常工作。