似乎用单个空格(“”)代替了换行符,而不仅仅是抑制了它们。

例子:

<@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_formatHTMLXML等,那么您将需要类似captured?markup_string?replace(...)?no_esc的东西。也就是说,您必须将捕获的标记转换为纯字符串,对其进行修改,然后将其转换回再次标记。)

请注意,如果您将自定义压缩Writer传递给Template.process,则还可以解决模板之外的压缩问题。

关于java - Freemarker压缩single_line,不带空格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21102122/

10-08 23:39