我使用bleach
,它使用html5lib
来清理用户生成的内容,这些内容是设计为dust.js
模板的HTML片段
一切都很好,除了这个情况-
输入:<table>
{#loop}
<tr>
<td>{name}</td>
</tr>
{/loop}
</table>
输出: {#loop}
{/loop}
<table>
<tr>
<td>{name}</td>
</tr>
</table>
循环标记在表外排序。这是完美的意义- html5lib是纠正我的html;除非在td/th标签中包装,否则内容不应该在表结构中。我通常希望发生这样的更正,并且仍然希望发生更正-但是我想知道是否有一种方法可以以某种方式让这些标签通过。
有没有人在过去遇到过类似的情况,并且能够抑制这种消毒行为?
到目前为止,我想到的唯一方法是将控件包装在一个可以正则化的标记中:
<table>
<tr data-layout=""><td>{#loop}</td></tr>
<tr>
<td>{name}</td>
</tr>
<tr data-layout=""><td>{/loop}</td></tr>
</table>
这种方法的问题是,一旦我正则化了这个格式化技巧,我就不能轻易地重新构建它了。编码后的模板变得不可编辑。
这与清理无关,这是关于解析(每个规范!)扶植式是HTML解析器直接处理表元素中的大多数内容的方式;要改变这一点,您必须更改html5parser.py
中的解析器。html5lib旨在实现一个符合标准的HTML解析器——它没有api使其不符合标准。
Bleach内置了白名单标签/属性。但是,您可以扩展或覆盖现有的白名单标记/属性。下面是一个如何将自定义标签添加到现有"白名单"的示例;
bleach.ALLOWED_TAGS.extend( ['{#*}' , '{/*}' ] )
简单的漂白将标记"{#loop} {/loop}"标记是安全的转义。
** Bleach官方文档提供了如何定义通配符白名单标签/属性的详细信息。