TL;DR: я хочу хакнуть внутренности CKEditor, чтобы он создавал альтернативный формат для форматированного текста (вместо HTML), и мне нужно мнение эксперта относительно осуществимости этой идеи. .
Я работаю над проектом, для которого требуется редактор форматированного текста для совместной работы (например, Google Docs), и я планирую использовать библиотеку оперативного преобразования (ShareJS), чтобы реализовать его. Но операционное преобразование трудно реализовать с помощью HTML из-за правил вложения тегов. Например, наивная реализация OT будет склонна к созданию такого мусора:
<b>overlapping bold <i>and</b> italic text.</i>
Правильный способ представления такого текста в HTML будет примерно таким:
<b>overlapping bold </b>
<b><i>and</i></b>
<i> italic text.</i>
Или еще лучше, что-то вроде этого:
<span class="bold">overlapping bold </span>
<span class="bold italic">and</span>
<span class="italic"> italic text.</span>
Но для получения таких представлений реализация OT должна знать все правила вложения HTML-тегов и способы исправления ошибочных слияний.
Я думал о возможном решении с использованием альтернативной формы разметки, которая вообще не применяет правила вложения тегов. Что-то вроде этого:
BOLD (start: 0, length: 20)
ITALIC (start: 17, length: 16)
TEXT:overlapping bold and italic text.
Используя такой формат, я мог бы использовать обычную OT-библиотеку для управления текущими операциями сравнения/перебазирования/слияния, а затем в последний момент преобразовывать результирующий документ в HTML перед обновлением графического интерфейса на обеих сторонах совместной работы.
Самый простой способ реализовать это — запросить у CKEditor вывод HTML, а затем постфактум реконструировать документ в новом формате. Но OT потребовал бы, чтобы я выполнял это преобразование при каждом нажатии клавиши, и это кажется слишком тяжелым. Из соображений производительности мне интересно, можно ли переопределить средство записи HTML по умолчанию в CKEditor, попросив его создать альтернативный формат при обходе DOM.
Что вы думаете?