Freemarker:保留宏内标签空格,移除普通HTML标签间空格
解决Freemarker模板仅压缩常规HTML、保留宏内标签空格的问题
我需要处理Freemarker(FTL)模板,要求移除常规HTML标签之间的空格,但保留<#macro>宏内部HTML标签的空格。目前使用<#compress>指令会同时处理宏内内容,导致宏里的标签空格也被修改,求正确实现方案。
示例文件
People.ftl
<#macro people> <#include "address.ftl"> </#macro>
Address.ftl
... .... <#macro> <div class="custom content"> ${.node.@@text} </div> </#macro> ... ....
当前输出(宏内空格被错误压缩)
<div> <div> <p>From Address.ftl</p> </div> <div> <p>From Address.ftl</p> </div> <div class="custom content"> <p>From macro Address.ftl. I have white space between sub tags <sub> </sub> like this </p> </div> </div>
期望输出(仅压缩常规HTML,宏内空格保留)
<div><div><p>From Address.ftl</p></div><div><p>From Address.ftl</p></div> <div class="custom content"> <p>From macro Address.ftl. I have white space between sub tags <sub> </sub> like this </p> </div></div>
解决方案
方案1:局部使用<#compress>,仅包裹常规HTML
不要全局启用<#compress>,只把需要压缩的常规HTML代码块用<#compress>包裹,宏的定义和调用都放在这个块外面:
<#compress> <!-- 这里是需要压缩的常规HTML --> <div> <div> <p>From Address.ftl</p> </div> <div> <p>From Address.ftl</p> </div> </#compress> <!-- 宏调用不在compress块内,宏输出的内容会保留空格 --> <@people />
这种方式下,常规HTML部分的标签空格会被压缩,宏内部的HTML空格完全保留。
方案2:全局启用<#compress>,宏内用<#nocompress>包裹
如果必须全局开启<#compress>(比如模板头部已添加该指令),可以在宏内部用<#nocompress>包裹需要保留空格的内容,跳过压缩处理:
修改Address.ftl中的宏:
<#macro> <#nocompress> <div class="custom content"> ${.node.@@text} </div> </#nocompress> </#macro>
全局的<#compress>会处理常规HTML,而宏内被<#nocompress>包裹的内容会保留原有空格。
内容的提问来源于stack exchange,提问作者CodeJack
相关产品推荐
相关产品推荐

