Часто задаваемые вопросы в Google Wave Protocol говорят, что [HTML] "не имеет желаемых свойств" и что "HTML делает OT (операционные преобразования) сложным, если не невозможным" [1]. Почему это так? Какие проблемы возникают, если HTML обрабатывается просто как обычный текст, а затем применяется OT?
Работает ли операционная трансформация на структурированных документах, таких как HTML, если их просто рассматривать как простой текст?
Ответ 1
Я предполагаю, что вы понимаете основы OT. Основная проблема с выполнением OT в HTML как обычный текст - это слияние тегов html. В качестве простого примера, скажем, у нас был документ следующим образом:
Hello world
Затем Алиса решает, что мир должен быть выделен жирным шрифтом:
Hello <b>world</b>
Это может быть представлено с помощью операции двойной вставки в OT, схематически:
Edit A: Keep 6 : Insert "<b>" : Keep 5 : Insert "</b>"
Если Боб решил, что "мир" должен быть выделен курсивом, прежде чем он увидит редактирование Алисы, он добавит операцию
Edit B: Keep 6 : Insert "<i>" : Keep 5 : Insert "</i>"
Если сервер получил сообщение Боба после Алисы, ему нужно будет преобразовать B в A, чтобы стать B '.
Операторы Keep не изменяются посредством преобразования, но Insert ", преобразованный через Insert" ", может стать либо Keep 3: Insert" ", либо Insert" ": Keep 3. Обычно сервер будет настроен для размещения более позднего редактирования после сначала отредактируйте.
Edit B': Keep 6 : Keep 3 : Insert "<i>" : Keep 5 : Keep 3 : Insert "</i>"
Здесь проблема становится очевидной. Применяя A, то B 'к исходной строке дает недопустимый html:
Hello <b><i>world</b></i>
Теоретически это можно было бы решить, изменяя предварительные и пост-вставки, но это будет волосатое для более сложных примеров, потенциально включающее полное сканирование документа для каждого преобразования.
Как заметил другой ответ, этого беспорядка можно избежать, используя внеполосные аннотации + обычный текст. Другим подходом, который я видел до сих пор в научных статьях, является рассмотрение структуры XML как дерева с операциями OT для добавления node, удаления, например:
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.100.74
Ответ 2
У меня нет полного ответа, но я заинтересован в том, чтобы проделать большую работу над тем, чтобы существующие библиотеки операционных преобразований с открытым исходным кодом работали с богатым текстом, поэтому я буду вносить то, что знаю.
Важным отличием между HTML и Wave-схемой является способ форматирования текста: иерархия вложенных тегов для HTML и внеполосных аннотаций (в нижнем колонтитуле документа) с диапазонами для Wave XML. Внеполосные аннотации, вероятно, более естественный способ разметки форматирования текста, поскольку они позволяют перекрывать (не вложенные) форматы. Он допускает что-то вроде этого (в псевдо-разметке), который не был бы корректным XML, используя вложенное представление:
(b) This is bold (i) while this range is both bold and italic (/b) and this last bit is just italic (/i)
Связанный, вот релевантная проблема в проекте ShareJS. Возможно, они могут реализовать поддержку расширенного текста, приняв часть схемы Wave XML.
Ответ 3
Возможно, это вас интересует:
CEFX - это проект, который нацелен на поддержку XML - это, насколько мне известно, мертво. Но он использует подход OT. По какой-то причине невозможно редактировать только строковые элементы xml.
SDK Google Drive поддерживает графические структуры данных. Это, однако, запатентовано, и никто не знает, как это работает.
Я разрабатываю структуру, которая поддерживает произвольные структуры данных. В настоящее время поддерживаются текст, Json, XML и HTML. У этого есть другой подход: проверьте его: Yatta!
BTW: что протокол Wave и описание Эрика Дрехселя известны как Аннотации в OT. Он обычно используется для поддержки расширенного текста.