Freemarker сжимает single_line без пробелов
Кажется, что <@compress single_line = true> заменяет разрывы строк одиночными пробелами (" "), а не просто подавляет их.
Пример:
<@compress single_line=true>
"First cell"
<#if something >
|"Second cell"
</#if>
|"Third cell"
</@compress>
Является ли печать:
"First cell" |"Second cell" |"Third cell"
Что не может быть проанализировано устаревшей системой только из-за пробелов между каналами.
Есть ли способ избежать этого? Возможно, способ прочитать каждую "вложенную" строку в макросе, чтобы заменить функциональность @compress?
В конце концов, я не хочу "структурный исходный код", но код представления, поэтому назначение переменных для простой печати результата не будет хорошим.
Заранее спасибо, всего наилучшего.
3 ответа
@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
,
Спасибо @ddekany, чтобы ответить на этот вопрос. Далее приведен простой код, который обрезает:
- Ведущие пробелы (^\s+)
- Конечные пробелы (\s+$)
- Переносы строк (\n|\r)
Использование регулярных выражений в многострочном режиме (параметр "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.
Следующее решение также работает нормально:
<#assign var>
"First cell"
<#if something >
|"Second cell"
</#if>
|"Third cell"
</#assign>
${var?replace("^\\s+|\\s+$|\\n|\\r", "", "rm")}