【问题标题】:HTML editor removes FreeMarker tags inside <table> tagHTML 编辑器删除 <table> 标签内的 FreeMarker 标签
【发布时间】:2020-12-08 00:56:08
【问题描述】:

我使用 FreeMarker 构建从电子邮件到发票模板的各种模板。我现在正在寻找的问题与在表格标签之外提取的 FreeMarker 代码有关,因为 HTML 不允许在其中包含 tbody、thead、tr 之外的其他字符。

如果有人知道如何绕过这个,我们会很高兴。

例子:

<table>
                    <tbody>
                        [#assign eventDetails = []]
                        [#if items?? && 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?? && 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>

【问题讨论】:

  • 不幸的是,您将不得不修改 HTML 编辑器的代码,或者为在呈现之前如何编辑它们找到另一种解决方案。
  • 啊,这就是我害怕的。我已经进行了修改并使用 div 和 flex 来获得类似表格的外观,它在浏览器中工作正常,但在电子邮件和 PDF 上不起作用。不过还是谢谢你的提议!

标签: html freemarker


【解决方案1】:

这当然只取决于您使用的 HTML 编辑器,但如果出现同样的情况,您应该尝试:

  • 您使用的是&lt;#...&gt; 语法。这看起来像是编辑器的某个未知标签,而不是 CDATA,所以它的反应方式可能不同。
  • &lt;tbody&gt;...&lt;/tbody&gt; 替换为[@html.tbody]...[/@html.tbody]。那么编辑器可能没有足够的信心删除内容。或者,[@html.table] 等也一样。相当尴尬,但可能比你现在拥有的更好。 (为了在运行模板时真正起作用,您当然必须在 html 命名空间中定义 tbody 宏。它不是内置的。)

最后一个例子:

<#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-ed 为html,那么&lt;@html.table foo="bar"&gt;...&lt;/@html.table&gt; 等将起作用。

【讨论】:

  • 祝福你!你的建议为我节省了一周的痛苦。 :) 我已经使用宏解决了这个问题,现在它就像一个魅力。问题在于使用 DOM 的 innerHTML 函数,大多数编辑器使用它在 textarea 中正确呈现 HTML。
猜你喜欢
  • 1970-01-01
  • 2013-07-19
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多