2014-01-13 5 views
3

Кажется, что < @compress single_line = true> заменяет разрывы строк одиночными пробелами ("") вместо того, чтобы просто подавлять их.Freemarker compress single_line без пробелов

Пример:

<@compress single_line=true> 
"First cell" 
<#if something > 
    |"Second cell" 
</#if> 
|"Third cell" 
</@compress> 

Является ли печать:

"First cell" |"Second cell" |"Third cell" 

, который не может быть обработан с помощью традиционной системы только из-за промежутков между трубами.

Есть ли способ избежать этого ?, возможно, способ прочитать каждую «вложенную» строку в макросе, чтобы заменить функциональность @compress?

В конце концов, я не хочу «структурный исходный код», но код представления, поэтому присвоение переменных просто для печати результата не будет приятным.

Заранее спасибо, с уважением.

ответ

1

@compress не полностью удаляет пробелы, потому что это изменит значение вывода почти во всех приложениях. @compress сам по себе является просто настраиваемой директивой (именно поэтому он использует @ вместо #). Только он всегда присутствует для обратной совместимости ... Итак, да, вы можете реализовать такие фильтры. Вы могли бы реализовать TemplateDirectiveModel (где вы можете использовать свою собственную реализацию Writer, чтобы сделать фильтрацию), затем перетащите ее в модель данных, например, с именем myCompress. Или вы можете вытащить его в шаблон, например #assign myCompress = 'com.example.MyCompressDirective'?new, где бы вы ни использовали #macro. В обоих случаях вы можете использовать его как <@myCompress>...</@myCompress>.

Собственно, вы можете решить эту проблему с помощью макроса. Вы можете захватить сгенерированный вывод внутри макроса с помощью <#local captured><#nested></#local>, затем использовать регулярные выражения с ?replace и т. Д. Это просто отвратительная ... фильтрация лучше подходит для Java. (Обратите внимание, что если output_format определяющего шаблона HTML, XML и т. Д., То вам понадобится что-то вроде captured?markup_string?replace(...)?no_esc. То есть вам нужно преобразовать захваченную разметку в обычную строку, внести изменения в нее, а затем преобразовать ее обратно для разметки снова.)

Обратите внимание, что вы также можете решить сжатие вне шаблона, если вы передаете пользовательское сжатие Writer на Template.process.

+0

Yesss ... спасибо так много. '<#local capture><#nested>' с регулярными выражениями, что лучше подходит моим потребностям, почему ?, потому что, если я смогу доставить мое решение без специального java-кода, это означает, что системный администратор сможет редактировать шаблон без необходимости I перекомпилировать, если требования будут изменены в ближайшем будущем. Как я могу больше не повторять ваш ответ? Я также высоко ценю решения на стороне Java, чтобы лучше понять архитектуру Freemarker, я проверю ее глубже. С уважением. –

6

Спасибо @ddekany, чтобы ответить на этот вопрос. Далее следует простой код, который урезает:

  1. Leading пространства (^ \ S +)
  2. завершающие пробелы (\ S + $)
  3. разрывы строки (\ п | \ г)

Использование регулярные выражения в многострочном режиме (параметр «rm»)

Вам просто нужно удалить любой элемент в выражении в соответствии с вашими потребностями, например, если вы просто хотите удалить отступ, не используйте 2 и 3 ;)

<#macro compress_single_line> 
    <#local captured><#nested></#local> 
${ captured?replace("^\\s+|\\s+$|\\n|\\r", "", "rm") } 
</#macro> 
<@compress_single_line> 

    My free indented content  

     ${ someVar } 

</@compress_single_line> 

Надеюсь, что это дополняет полезный ответ @ ddekany.

+0

Спасибо, что помогли мне создать этот похожий макрос (должно быть в одной строке): <#macro compress_empty_lines><# local capture><#nested> $ {capt? Replace ("^ \\ s * [\\ n \ \ r] + "," "," rmg ")}

+0

Необходимы дополнительные шаги, если макрос определен в шаблоне, который использует escaping' output_format', например 'HTML' или' XML', а затем захваченный значение не будет строкой, а «выводом разметки». Я добавил соответствующую информацию к моему ответу. – ddekany

1

Следующее решение работает также хорошо:

<#assign var> 
"First cell" 
<#if something > 
    |"Second cell" 
</#if> 
|"Third cell" 
</#assign> 
${var?replace("^\\s+|\\s+$|\\n|\\r", "", "rm")} 
Смежные вопросы