似乎< @compress single_line = true>正在用单个空格(“”)替换换行符,而不是仅仅抑制它们。
示例:
<@compress single_line=true>
"First cell"
<#if something >
|"Second cell"
</#if>
|"Third cell"
</@compress>
打印:
"First cell" |"Second cell" |"Third cell"
由于管道之间的空格,传统系统无法对其进行解析。
有什么方法可以避免这种情况吗?也许是一种方法来读取宏中的每个“嵌套”行来替换@compress的功能?
最后,我不想要“结构源代码”,而是介绍代码,所以分配给变量来打印结果不会很好。
提前谢谢,亲切的问候。
答案 0 :(得分:7)
感谢@ddekany回答这个问题。接下来是修剪的简单代码:
在多行模式下使用正则表达式(“rm”参数)
您只需删除表达式上的任何元素以满足您的需要,例如,如果您只想删除缩进,请不要使用2和3;)
<#macro compress_single_line>
<#local captured><#nested></#local>
${ captured?replace("^\\s+|\\s+$|\\n|\\r", "", "rm") }
</#macro>
<@compress_single_line>
My free indented content
${ someVar }
</@compress_single_line>
希望这有助于@ddekany的回答。
答案 1 :(得分:2)
@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
,也可以解决模板外的压缩问题。
答案 2 :(得分:1)
以下解决方案也可以正常使用:
<#assign var>
"First cell"
<#if something >
|"Second cell"
</#if>
|"Third cell"
</#assign>
${var?replace("^\\s+|\\s+$|\\n|\\r", "", "rm")}