JTidy довольно печатает пользовательский HTML-тег

Я пытаюсь использовать JTidy для красивой печати хорошо сформированного HTML, сгенерированного пользователем:

<div class="component-holder ng-binding ng-scope ui-draggable ui-draggable-handle" data-component="cronos-datasource" id="cronos-datasource-817277">
    <datasource name="" entity="" key="" endpoint="" rows-per-page="">
        <i class="cpn cpn-datasource"></i>
    </datasource>
</div>

Это моя конфигурация:

Tidy tidy = new Tidy();
tidy.setXHTML(true);
tidy.setIndentContent(true);
tidy.setPrintBodyOnly(true);
tidy.setTidyMark(false);
tidy.setWraplen(2000);
tidy.setDropProprietaryAttributes(false);
tidy.setDropEmptyParas(false);
tidy.setTrimEmptyElements(false);

Но jTidy удаляет мою директиву AngularJS datasource. Есть ли способ решить эту проблему?

Я получаю это из журнала:

line 1 column 191 - Error: <datasource> is not recognized!
line 1 column 191 - Warning: discarding unexpected <datasource>

Удаление tidy.setXHTML(true) или установка его в false и добавление tidy.setXmlTags(true) действительно решить эту проблему, и он начнет рассматривать теги, определенные пользователем, но это не очень хорошее решение, потому что JTidy начинает пытаться закрыть теги, закрывающие теги.

 <!-- this code -->
 <img src="anythig.jpg"/>
 <div id="anyid"></div> 

 <!-- will become -->
 <img src="anythig.jpg">
     <div id="anyid"></div>
 </img>

Мне нужен форматтер для текстового редактора. Я не могу гарантировать, какие директивы наши пользователи будут определять и использовать. Это должно быть общее решение, которое работает для любой определяемой пользователем директивы

Ответ 1

Я решил эту проблему, внеся некоторые изменения в источник JTidy

https://github.com/nanndoj/jtidy

Я добавил новую конфигурацию под названием dropProprietaryTags

tidy.setDropProprietaryTags(false);

Теперь он отлично работает для меня. По умолчанию он установлен на true, поэтому JTidy может работать по-старому, если новое свойство не установлено на false

Ответ 2

Попробуйте установить следующее свойство после вашей текущей конфигурации:

Properties props = new Properties();
props.setProperty("new-blocklevel-tags", "datasource");
tidy.getConfiguration().addProps(props);

См. http://tidy.sourceforge.net/docs/quickref.html#new-blocklevel-tags.