在 Dancer2 的 config.yml 中配置 Template::Toolkit(修剪空格)

Configuring Template::Toolkit in Dancer2's config.yml (trimming whitespace)

我正在使用 Dancer2 构建 Web 应用程序。它工作得很好,但是当我在浏览器中 查看源代码 时,生成的 HTML 源代码充满了分散的空白,就像这样

    <tr>
        <td>2</td>



            <td>Cheeseburger</td>

        <td>4.50&nbsp;€</td>
    </tr>

我的模板在现在空白的地方有 <% ... %> 代码。我希望它看起来像这样:

    <tr>
        <td>2</td>
            <td>Cheeseburger</td>
        <td>4.50&nbsp;€</td>
    </tr>

或者,甚至更好:

<tr><td>2</td><td>Cheeseburger</td><td>4.50&nbsp;€</td></tr>

我正在使用 Template::Toolkit 并认为 TRIM 属性正是我所需要的,并将其添加到我的 config.yml:

template: "template_toolkit"
session: "YAML"

engines:
  session:
    YAML:
      cookie_duration: 6 months
  template:
    template_toolkit:
      start_tag: '<%'
      end_tag:   '%>'
      TRIM:      '1'

但这行不通。我已经将 start_tagend_tag 更改为不同的内容(以验证已读取此文件)并且确实有效。但是 TRIM 选项没有。

我是用错了选项还是给错了地方?我所做的所有谷歌搜索都显示了如何以编程方式设置 TT 选项,例如在 this answer。但是因为我没有明确地实例化任何与 TT 相关的东西,所以我什至不知道我应该把这样的代码放在哪里。


我使用 dancer2 -a so 创建了我的应用程序。

views/index.tt

<table>
    <tbody>
        <% FOREACH item in group.items %>
            <tr>
                <td><% item.order_num %></td>
                <%# one-line comment %>
                <%# one-line comment %>
                <%# one-line comment %>
                    <td><% item.desc %></td>
                <%# one-line comment %>
                <td><% currency(item.price) %></td>
            </tr>
        <% END %>
    </tbody>
</table>

group.items 是一个哈希引用数组; currency 是一个格式化价格的函数。 <%# one-line comment %> 是我的旧代码(我正在从 Handlebars 迁移到 Dancer2)。

lib/so.pm(应用模块)

package so;
use Dancer2;

our $VERSION = '0.1';

get '/' => sub {

    my $group = {
        items => [
            {
                order_num => 1,
                desc => 'Hamburger',
                price => 350,
            },
            {
                order_num => 2,
                desc => 'Cheeseburger',
                price => 450,
            },
        ]
    };

    template 'index', {
        group => $group,
        currency => sub { sprintf('%.2f&nbsp;€', $_[0]/100); },
    };
};

true;

您在配置文件中正确启用了 TRIM,但 TRIM 仅删除块或模板文件开头和结尾的空格。要从模板文件中间删除空格,请使用 PRE_CHOMP/POST_CHOMP:

Anything outside a directive tag is considered plain text and is generally passed through unaltered...This includes all whitespace and newlines characters surrounding directive tags. Directives that don't generate any output will leave gaps in the output document.

Example:

Foo
[% a = 10 %]
Bar

Output:

Foo

Bar

The PRE_CHOMP and POST_CHOMP options can help to clean up some of this extraneous whitespace. Both are disabled by default.

PRE_CHOMPPOST_CHOMP 有几种可能的设置会影响去除多少空白; none 它们产生了非常漂亮的输出,所以你必须尝试并决定你最喜欢哪个。

另一种去除多余白色的可能性space是collapse过滤器1, 2 Template::Toolkit。它将所有连续的白色space(包括换行符)折叠为单个 space 字符:

来自文档:

[% FILTER collapse %]

   The   cat

   sat    on

   the   mat

[% END %]

Output:

The cat sat on the mat

我的views/layouts/main.tt包含一行

<% content %>

如果我将其替换为

<% content FILTER collapse %>

然后 HTML 页面的结果主体是一行(而且很长)。

注意: 这会破坏任何 <pre><code> 块(也许更多)。