Настройка Template::Toolkit в config.yml Dancer2 (удаление пробелов)

Я использую Dancer2 для создания веб-приложения. Он отлично работает, но когда я просматриваю исходный код в браузере, сгенерированный исходный код 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_tag и end_tag на что-то другое (чтобы убедиться, что этот файл прочитан), и это действительно сработало. А вариант TRIM нет.

Я использую неправильный вариант или даю его не в том месте? Все поиски в Google, которые я сделал, показали, как программно установить TT-опции, например. в этом ответе. Но поскольку я явно не создаю экземпляров, связанных с TT, я даже не знаю, куда мне поместить такой код.


Я создал свое приложение с помощью dancer2 -a so.

представления/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;

person PerlDuck    schedule 07.12.2016    source источник
comment
Пожалуйста, покажите фрагмент шаблона, который совпадает с вашим примером здесь, чтобы мы могли протестировать.   -  person stevieb    schedule 07.12.2016
comment
@stevieb Я только что исправил свой пост.   -  person PerlDuck    schedule 08.12.2016
comment
Вы также можете игнорировать пробелы в отдельных блоках, поставив там -. <%- и -%> соответственно. Будьте осторожны, если вы используете это в коде JS, вы можете выстрелить себе в ногу.   -  person simbabque    schedule 08.12.2016
comment
@simbabque Я попробую это на следующем шаге. Но спасибо, что вообще указали мне на Dancer2. Это просто офигенно :-) по сравнению с компьютерной графикой. Как Ассемблер против какого-то языка высокого уровня.   -  person PerlDuck    schedule 08.12.2016
comment
Я рад слышать, что. Вы уже разобрались с развертыванием? Это немного отличается от CGI (если только вы не используете CGI, но это будет не самый умный ход).   -  person simbabque    schedule 08.12.2016


Ответы (2)


Вы правильно включаете TRIM в файле конфигурации, но TRIM удаляет пробелы только с самого начала и с самого конца файла блока или шаблона. Чтобы удалить пробелы в середине файла шаблона, используйте PRE_CHOMP/POST_CHOMP:

Все, что находится за пределами тега директивы, считается обычным текстом и обычно передается без изменений... Это включает в себя все пробелы и символы новой строки, окружающие теги директивы. Директивы, которые не генерируют никаких выходных данных, оставят пробелы в выходном документе.

Пример:

Foo
[% a = 10 %]
Bar

Выход:

Foo

Bar

Параметры PRE_CHOMP и POST_CHOMP могут помочь очистить некоторые из этих лишних пробелов. Оба отключены по умолчанию.

Есть несколько возможных настроек для PRE_CHOMP и POST_CHOMP, которые влияют на то, сколько пробелов удаляется; ни один из них не дает действительно красивого результата, поэтому вам придется поиграть и решить, какой из них вам больше нравится.

person ThisSuitIsBlackNot    schedule 07.12.2016
comment
Спасибо за подтверждение того, что я правильно установил TRIM в config.yml. Это очень помогло. Я немного поиграл с PRE/POST_CHOMP, и он действительно дает лучшие (хотя и не идеальные) результаты. Я неправильно понял TRIM и подумал, что он максимально похож на PRE и POST_CHOMP. - person PerlDuck; 08.12.2016

Еще одна возможность избавиться от лишних пробелов — это фильтр collapse1, 2 из Template::Toolkit. Он сворачивает все последовательные пробелы (включая символы новой строки) в один символ пробела:

Из документов:

[% FILTER collapse %]

   The   cat

   sat    on

   the   mat

[% END %]

Вывод:

The cat sat on the mat

Мой views/layouts/main.tt содержит строку

<% content %>

Если я заменю это на

<% content FILTER collapse %>

тогда результирующее тело HTML-страницы представляет собой одну единственную (и очень длинную) строку.

Внимание: это сломает все блоки <pre> и <code> (и, возможно, некоторые другие).

person PerlDuck    schedule 20.12.2016