Freemarker压缩single_line没有空格

时间:2014-01-13 21:53:28

标签: java freemarker

似乎< @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的功能?

最后,我不想要“结构源代码”,而是介绍代码,所以分配给变量来打印结果不会很好。

提前谢谢,亲切的问候。

3 个答案:

答案 0 :(得分:7)

感谢@ddekany回答这个问题。接下来是修剪的简单代码:

  1. 前导空格(^ \ s +)
  2. 尾随空格(\ s + $)
  3. 换行符(\ n | \ r)
  4. 在多行模式下使用正则表达式(“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_formatHTMLXML等,那么您需要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")}