директивы скорости также добавляют пробелы?

Я только что узнал, что со скоростью apache директивы также добавляют пробелы.

Так, например:

#foreach ($record in $rows)
#foreach($value in $record)
$value  
#end

#end

С чем-то вроде этого я получаю дополнительные строки для операторов #foreach, операторов #end и т. д.

Это не то, что я хочу, поэтому я обнаружил, что могу заблокировать комментарий в конце строк следующим образом:

#foreach ($record in $rows)#*
*##foreach($value in $record)#*
*#$value    #*
*##end

#end

Но это довольно неприятно читать. Есть ли способ сказать движку скорости не форматировать мои директивы?

Может я еще что-то не так делаю?

Спасибо.


person javamonkey79    schedule 13.12.2011    source источник
comment
Одна вещь, которая всегда раздражала меня в Velocity — я использую ее для генерации Java, поэтому я могу просто отформатировать ее в своей IDE после генерации. JET (шаблоны эмиттера Java), похоже, не страдает от этой проблемы.   -  person James Bassett    schedule 14.12.2011
comment
Кажется, это то, с чем люди мирятся и потом убирают, например. этот SO вопрос относительно приведение в порядок HTML после генерации.   -  person James Bassett    schedule 14.12.2011
comment
Хм, это отстой. Я предполагаю, что моя работа вокруг должна будет сделать тогда.   -  person javamonkey79    schedule 14.12.2011
comment
Какую версию ты используешь? Это была давняя проблема, граничащая с 5-8 годами. Сейчас есть это, что может быть, а может и не быть тем, что вам нужно. Блочные комментарии или комментарии EOL ## являются каноническим решением.   -  person Dave Newton    schedule 14.12.2011
comment
Эта ссылка интересная... особенно часть schmoo...???!!!   -  person James Bassett    schedule 14.12.2011
comment
Аналогичный вопрос: stackoverflow.com/ вопросы/8594022/   -  person Vadzim    schedule 25.06.2015


Ответы (2)


Я думаю, вы застряли с этим (см. статью Velocity Whitespace Gobbling), хотя комментарии к строке были бы немного аккуратнее:

#foreach ($record in $rows)##
#foreach($value in $record)##
$value    ##
#end

#end

Или вы можете просто втиснуть все в одну строку:

#foreach($record in $rows)#foreach($value in $record)${value}#{end}#{end}
person Edd    schedule 23.12.2011
comment
## у меня не работает. Работает только размещение моих макросов в одной строке. Любые идеи, почему это будет? - person El Guapo; 29.04.2016

На самом деле это характерно почти для всех языков шаблонов, и аргументация исходит непосредственно из упрощенной обработки. Рассмотрим следующий пример (на самом деле это GSP, используемый Grails, но идея та же):

<g:each var="x" in="exes">
    ${x.y}
</g:each>

Это обрабатывается следующим образом: сначала идентифицируется тег (или, в случае Velocity, директива). Поскольку сам тег/директива содержит инструкции по обработке тела тега, метки тега/директивы удаляются, и все содержимое сразу после начальной метки и непосредственно перед конечной меткой используется в качестве цели для обработки. Это включает в себя все пробелы, потому что предварительная очистка вывода будет намного сложнее.

Это, конечно, не означает, что вы не можете этого сделать, как указывает Эдд, или что это было бы в первую очередь наиболее разумным выбором дизайна, но иногда делать что-то проще важнее, чем создавать красивую разметку — в конце концов. , большинству, если не всем процессорам разметки, на самом деле все равно, есть ли у вас <p>some\ncontent</p> или <p>some\n\n\n\t\tcontent</p>.

person Esko    schedule 23.12.2011