Как заменить возврат каретки с помощью freemarker и spring?

у меня есть интернационализированное приложение, которое использует spring и freemarker. Я получаю контент из локализованных файлов свойств, используя.

${rc.getMessage("help.headings.frequently_asked_questions")}

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

каков наилучший способ сделать это?

Edit: при ближайшем рассмотрении кажется, что у меня на самом деле нет возврата каретки в файлах свойств. Свойства возвращаясь в виде однострочных строк.

есть ли лучший способ объявить свойства, чтобы они знали, что они многострочные?

help.faq.answer.new_users=If you have not yet set a PIN, please enter your username and passcode (from your token) in the boxes provided and leave the PIN field blank.
You will be taken through the steps to create a PIN the first time you log in.

Ура, Пит!--3-->

5 ответов


${springMacroRequestContext.getMessage("help.headings.frequently_asked_questions", [], "", false)?html?replace("\n", "<br>")}


как

есть ли лучший способ объявить свойства, чтобы они знали, что они многострочные?

часть вашего вопроса, возможно, это поможет: вы можете включить символы Терминатора строки в свои значения свойств, используя \r и \n escape-последовательности, как это описано в API документация java.util.Properties#load(java.io.Reader).


<#escape x as x?html?replace('\n', '<br>')>...</#escape>

работает просто отлично.

Если вы хотите, чтобы это было поведение по умолчанию, подумайте о написании пользовательского TemplateLoader, как предложено в этом блоге:http://watchitlater.com/blog/2011/10/default-html-escape-using-freemarker/.


для обработки окончаний линии CR + LF (возврат каретки + подача линии), а также просто LF сделайте это:

<#escape x as x?html?replace("\r?\n","<br />",'r')>...</#escape>

Я бы рекомендовал написать для него пользовательскую директиву (см. freemarker.template.TemplateDirectiveModel), поэтому в ваших шаблонах вы можете написать что-то вроде <@my.textAsHtml springMacroRequestContext.getMessage(...) />. Важно, что это директива, а не функция, поэтому она работает правильно внутри <#escape x as x?html>...</#escape>. В противном случае это был бы двойной побег. Использование директивы также может дать максимальную производительность, так как вы можете напрямую отправить вывод на выход Writer, а не строить String первый.