Генерация не-HTML-разметки из CKEditor

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.

Что вы думаете?


person benjismith    schedule 08.12.2013    source источник
comment
Звучит очень сложно, так как ckeditor использует contenteditable и во многом зависит от браузера. Как насчет использования системы, подобной StackOverflow, для предварительного просмотра QA? Я имею в виду использование какого-то равномерного регулирования, чтобы преобразование происходило не для каждого запускаемого события, а с setTimeout, который регулирует его, скажем, максимум 1/сек.   -  person Joel Peltonen    schedule 10.12.2013
comment
Тем не менее, изменение каждой 1 секунды через всю редактируемую структуру может быть тяжелым. Тем более, что для ОТ нужно сначала нормализовать контент, потому что ОТ на HTML очень сложно. Как вы упомянули, прослушивание действий пользователя будет затруднено, потому что браузеры обрабатывают половину из них, а браузеры непредсказуемы. Лично я бы не стал рисковать использовать OT и создавать собственный алгоритм, который мог бы работать с деревом DOM.   -  person Reinmar    schedule 11.12.2013
comment
@ Рейнмар, мне как основному коммиттеру особенно интересно твое мнение. Но на мгновение, если вы готовы притвориться, что это хорошая идея, я хотел бы услышать, как я мог бы реализовать свой собственный DOM-обходчик, чтобы заменить вывод HTML во внутренних компонентах CKEditor. . Хорошая это идея или нет — вопрос отдельный. Меня интересует, как начать. Спасибо!   -  person benjismith    schedule 14.12.2013


Ответы (1)


Это может быть очень невежественный ответ, но я думал о том, чтобы сделать что-то подобное и с CKEditor. Моя мысль (и я еще не пробовала) заключалась в том, чтобы подключиться к буферам Undo/Redo и использовать это как своего рода OT бедняка, который пересылается туда и обратно по сети. Вероятно, потребуется написать свои собственные буферы Undo/Redo (или значительно расширить то, что уже есть). После этого все изменения станут серией экземпляров шаблона команд, а буферы отмены/возврата станут гигантским списком воспроизводимых команд.

Как я уже сказал, я еще не пробовал реализовать это вообще. Это может быть ужасной идеей по целому ряду причин. Это моя первая мысль о реализации какой-то функции совместного редактирования с помощью CKEditor.

person CleverPatrick    schedule 26.01.2014