zoukankan      html  css  js  c++  java
  • freemarker 空白处理

    1 一个简短的引论

    HTML 和 XML 都不是对空白敏感的,可是这么多多余的空白是非常令人头疼的,并且添加处理后的 HTML 文件大小也是不是必需的。当然,对于空白敏感的方式的输出这依然是个大问题。

    FreeMarker 提供以下的工具来处理这个问题:

    • 忽略某些模板文件的空白的工具(解析阶段空白就被移除了):
      • 剥离空白:这个特性会自己主动忽略在 FTL 标签周围多余的空白。这个特性能够通过模板来随时使用和禁用。
      • 微调指令: t , rt 和 lt ,使用这些指令能够明白地告诉 FreeMarker 去忽略某些空白。能够阅读參考手冊来获取很多其它信息。
      • FTL 參数 strip_text :这将从模板中删除全部顶级文本。

        对模板来说这非常实用,它仅仅包括某些定义的宏(还有以他一些没有输出的指令),由于它能够移除宏定义和其它顶级指令中的换行符,这样能够提高模板的可读性。


    • 从输出中移除空白的工具(移除临近的空白):
      • compress 指令

    2 剥离空白
    假设对于模板来说使这个特性成为可能的话,那么它就会自己主动忽略(也就是不在输出中打印出来)两种典型的多余空白:
    • 缩进空白和在行末尾的尾部空白(包括换行符)将会被忽略,仅仅会留下 FTL 标签(比方 <@myMacro/> , <#if ...> )和 FTL 凝视(如 <#-- blah --> ),除了被忽略的空白本身。比如,假设一行仅仅包括一个 <#if ...> ,那么在标签前面的缩进和标签后面的换行符将会被忽略。然而,假设这行上包括 <#if ...>x ,那么空白就不会被忽略,由于这个 x 不是 FTL 标签。注意,依据这些规则,一行上 包 含 <#if ...><#list ...> , 空 白 就 会 被 忽 略 , 而 一 行 上 有<#if ...> <#list ...> 这种就不会,由于在两个 FTL 标签之间的空白
      是嵌入的空白,而不是缩进的或尾部空白。
    • 加在以下这些指令之间的空白会被忽略: macro , function , assign ,global , local , ftl , import ,但也是只指令之间唯独一个空白或 FTL凝视。实际应用中,它意味着你能够在宏定义和參数定义之间放置空行,由于行间距是为了更好的可读性,不包含打印不必要的空行(换行符)。


    默认的情况下剥离空白是开启的,程序猿能够留着无论( 建议这样做 )。

    注意开启剥离空白时不会减少模板运行的效率,剥离空白的操作在模板载入时就已经完毕了。

    剥离空白能够为单独的一行关闭,就是使用 nt 指令(对没有去掉空白的行来说)。



    3 使用 compress 指令
    第二种方法就是使用 compress 指令,和剥离空白相反,这个工作是直接基于生成的输出内容,而不是对于模板进行。也就是说,它会动态地检查输出内容,而不会检查生成输出 FTL 的程序。

    它会非常强势地移除缩进,空行和反复的空格/制表符(能够阅读參考手冊部分来获取很多其它信息)。

    所以对于以下这段代码:

    <#compress>
    <#assign users = [{"name":"Joe","hidden":false},
    <span style="white-space:pre">		</span>{"name":"James Bond", "hidden":true},
    <span style="white-space:pre">		</span>{"name":"Julia","hidden":false}]>
    List of users:
    <#list users as user>
      <#if !user.hidden>
      - ${user.name}
      </#if>
    </#list>
    That's all.
    </#compress>
    List of users:
    - Joe
    - Julia
    That's all.

    在默认情况下,名为 compress 的用户自己定义指令是能够在数据模型中存在的(因为向下兼容特性)。这和指令是同样的,除了能够选择设置 single_line 属性,这将 会 移 除 所 有 的介 于 其 中的 换 行 符 。在 最 后 那 个例 子 中 , 假设 使 用 <@compress
    single_line=true>...</@compress>来取代<#compress>...</#compress> ,那么就会得到例如以下输出:
    List of users: - Joe - Julia That's all.



    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    [设计模式]门面模式
    [设计模式]装饰者模式
    IE8半透明不显示出文字
    解决IE6,IE7不能隐藏绝对定位溢出的内容
    [设计模式]适配器模式
    linux学习网站
    PPP协议解析
    c语言面试题__指针篇
    单链表反转
    16道C语言面试题
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4797684.html
Copyright © 2011-2022 走看看