Обход специальной очистки HTML в html5lib / bleach

Я использую bleach, который использует html5lib очистить пользовательский контент, который представляет собой фрагменты HTML, разработанные как dust.js шаблоны

все работало нормально, кроме этой ситуации

вход:

<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>

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

2 ответа

Решение

Это вовсе не связано с очисткой, речь идет о синтаксическом анализе (согласно спецификации!). Foster-parenting - это то, как анализатор HTML обрабатывает большую часть контента непосредственно внутри элемента таблицы; чтобы изменить это, вы должны изменить парсер в html5parser.py, html5lib стремится реализовать соответствующий анализатор HTML - у него нет API, чтобы сделать его не соответствующим.

Bleach имеет встроенные теги / атрибуты белого списка. Однако вы можете расширить или переопределить существующие теги / атрибуты белого списка. Ниже приведен пример того, как вы можете добавить пользовательские теги к существующему "Белому списку";

bleach.ALLOWED_TAGS.extend( ['{#*}' , '{/*}' ] )

Просто bleach пометит теги "{#loop} {/loop}", чтобы избежать.

** Официальная документация Bleach содержит подробную информацию о том, как определять теги / атрибуты белого списка с подстановочными знаками.

Другие вопросы по тегам