似乎用单个空格(“”)代替了换行符,而不仅仅是抑制了它们。
例子:
<@compress single_line=true>
"First cell"
<#if something >
|"Second cell"
</#if>
|"Third cell"
</@compress>
正在打印:
"First cell" |"Second cell" |"Third cell"
遗留系统不能仅仅因为管道之间的空间而对其进行解析。
有什么方法可以避免这种情况吗?也许是一种方法来读取宏中的每个“嵌套”行以替代@compress的功能?
最后,我不需要“结构源代码”,但需要演示代码,因此分配给变量以仅打印结果将不是很好。
预先谢谢您,亲切的问候。
最佳答案
@compress
不会完全删除空白区域,因为这将改变几乎所有应用程序中输出的含义。从技术上来说,@compress
本身只是一个自定义指令(这就是为什么它使用@
而不是#
的原因)。为了向后兼容,只有它始终存在。因此,是的,您可以实现类似的过滤器。您可以实现TemplateDirectiveModel
(可以使用自己的Writer
实现进行过滤),然后将其放入数据模型中,例如,名称为myCompress
。或者,您可以在任何使用#assign myCompress = 'com.example.MyCompressDirective'?new
的地方像#macro
一样将其拉入模板。在这两种情况下,您都可以像<@myCompress>...</@myCompress>
一样使用它。
实际上,您也可以使用宏来解决此问题。您可以使用<#local captured><#nested></#local>
捕获宏内部的生成的输出,然后使用?replace
等正则表达式。这有点丑陋...筛选更适合Java。 (请注意,如果定义模板的output_format
是HTML
,XML
等,那么您将需要类似captured?markup_string?replace(...)?no_esc
的东西。也就是说,您必须将捕获的标记转换为纯字符串,对其进行修改,然后将其转换回再次标记。)
请注意,如果您将自定义压缩Writer
传递给Template.process
,则还可以解决模板之外的压缩问题。
关于java - Freemarker压缩single_line,不带空格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21102122/