Подавить все пробелы и новые строки для пользовательской директивы FreeMarker - PullRequest
1 голос
/ 24 июня 2019

Я реализую несколько директив для отображения содержимого в соответствии с некоторой пользовательской разметкой.Я хочу, чтобы источник Freemarker был читабельным, поэтому я хочу свободно использовать пробелы и разрывы строк в теле шаблона в источнике шаблона, но хочу подавить все из них, когда я на самом деле их визуализирую.Пример:

Рассмотрим источник FreeMarker для таблицы:

<@table args={"border": 1}>
 <@tr>
  <@td>table_data_with_no_line_breaks_r1c1</@td>
  <@td>table_data_with_no_line_breaks_r1c2</@td>
  <@td>table_data_with_no_line_breaks_r1c3</@td>
 </@tr>
 <@tr>
  <@td>table_data_with_no_line_breaks_r2c1</@td>
  <@td>table_data_with_no_line_breaks_r2c2</@td>
  <@td>table_data_with_no_line_breaks_r2c3</@td>
 </@tr>
</@table>

Каждая директива реализована примерно так:

class Table implements TemplateDirectiveModel {
 public void exec(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) {
  env.getOut().write("<custom_table>");
  body.render(env.getOut());
  env.getOut().write("</custom_table");
 }     
}

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

<custom_table>
<row><column>data</column><column>data</column></row>
<row><column>data</column><column>data</column></row>
</custom_table>

Как мне этого добиться?Я могу использовать директиву <#t> в конце каждой строки, чтобы обрезать пробел, но это кажется неуклюжим, и авторы шаблонов могут иногда забыть вставить это.Есть указатели?

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

FreeMarker не практичен, если вам часто требуется точное управление пробелами.Но при генерации HTML это обычно не проблема, так как количество пробелов (1 против большего) незначительно в большинстве мест в HTML.Если выходные данные должны быть удобочитаемыми, или дополнительный размер является проблемой, вы должны применить удаление или форматирование пробелов в Writer, который вы передаете FreeMarker.

0 голосов
/ 24 июня 2019

Вам нужно пройти через Freemarker's Обработка пробелов

Один из вариантов - White-space stripping

Если эта функция включена для шаблона, то онаавтоматически игнорирует (т.е. не печатает на выходе) два вида типичных лишних пробелов:

Например, внутри ftl

Сообщает информациюО шаблоне для FreeMarker и других инструментов также помогает программам автоматически определять, является ли текстовый файл файлом FTL.Эта директива, если она есть, должна быть самой первой в шаблоне.Любые пробелы перед этой директивой будут игнорироваться.

Установить для strip_whitespace значение параметра значение true

strip_whitespace: Это включает / отключает пробелзачистка.

Другой вариант - Использование compress directive

В отличие от зачистки пробелов, это работает непосредственно с сгенерированным выводом, а не с шаблоном.То есть он будет исследовать напечатанный вывод на лету, а не исследовать программу FTL, которая создает вывод.Агрессивно удаляет отступы, пустые строки и повторяющиеся пробелы / табуляции

<#compress>
...