Редактор HTML удаляет теги FreeMarker внутри тега

#html #freemarker

#HTML #freemarker

Вопрос:

Я использую FreeMarker для создания различных шаблонов от электронной почты до шаблонов счетов. Проблема, которую я ищу прямо сейчас, связана с извлечением кода FreeMarker за пределы тега table, поскольку HTML не допускает других символов внутри него, кроме tbody, thead, tr.

Был бы рад, если у кого-нибудь есть идея, как это обойти.

Пример:

 <table>
                    <tbody>
                        [#assign eventDetails = []]
                        [#if items?? amp;amp; items?has_content]
                            [#list items as item]
                                <tr>
                                    <td  style="padding: 5px;vertical-align: top;border-bottom: 1px solid #eee; text-align: center;">
                                        ${item.name}
                                    </td>
                                </tr>
                            [/#list]
                        [/#if]
                    </tbody>
                </table>
  

становятся такими после применения к редактору с использованием element.innerHTML:

 [#assign eventDetails = []]
[#if items?? amp;amp; items?has_content]
  [#list items as item]
  [/#list]
[/#if]
<table>
                    <tbody>
 
                                <tr>
                                    <td  style="padding: 5px;vertical-align: top;border-bottom: 1px solid #eee; text-align: center;">
                                        ${item.name}
                                    </td>
                                </tr>
                    </tbody>
                </table>
  

Комментарии:

1. К сожалению, вам придется либо изменить код редактора HTML, либо найти другое решение для их редактирования перед их отображением.

2. Ага, это то, чего я боялся. Я уже внес изменения и использую div с flex, чтобы получить табличный вид, и это отлично работает в браузере, но по электронной почте и PDF это не работает. Однако спасибо за ваше предложение!

Ответ №1:

Это, конечно, зависит только от используемого вами редактора HTML, но вы должны попробовать, если произойдет то же самое, если либо:

  • Вместо этого вы используете <#...> синтаксис. Это выглядит как какой-то неизвестный редактору тег, не CDATA, поэтому, возможно, он реагирует по-другому.
  • Замените <tbody>...</tbody> на [@html.tbody]...[/@html.tbody] . Тогда редактор может быть недостаточно уверен, чтобы удалять материал. Или то же самое с [@html.table] и т.д. Довольно неудобно, но может быть лучше, чем то, что у вас есть сейчас. (Чтобы это действительно работало при запуске шаблона, вам, конечно, придется определить tbody макрос в html пространстве имен. Это не встроено.)

Пример последнего:

 <#ftl output_format='HTML'>

<#macro table attrs...><@elementWithNested 'table' attrs><#nested></@></#macro>
<#macro tbody attrs...><@elementWithNested 'tbody' attrs><#nested></@></#macro>

<#macro elementWithNested elementName attrs>
<${elementName}<#if attrs?size != 0><#list attrs as k, v> ${k}="${v}"</#list></#if>>
<#nested>  
</${elementName}>
</#macro>
  

Если приведенный выше шаблон #import отредактирован как html , то <@html.table foo="bar">...</@html.table> и т.д. будет работать.

Комментарии:

1. Благословляю вас! Своим предложением вы избавили меня от недели мучений. 🙂 Я решил эту проблему с помощью макросов, и теперь это работает как по волшебству. Проблема заключается в функции innerHTML с использованием DOM, и большинство редакторов используют это для правильного отображения HTML внутри текстовой области.