Работает ли операционное преобразование в структурированных документах, таких как HTML, если их просто рассматривать как простой текст?

В FAQ по Google Wave Protocol говорится, что [HTML] "не имеет желаемых свойств" и что "HTML делает OT (Операционные преобразования) трудным, если не невозможным" [1]. Почему это так? Какие проблемы возникают, если HTML обрабатывается просто как простой текст, а затем применяется OT?

  1. http://www.waveprotocol.org/faq

3 ответа

Я предполагаю, что здесь вы понимаете основы 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 остаются неизменными посредством преобразования, но "Вставить", "преобразованный через Вставку", может стать "Хранить 3: Вставить" или "Вставить"": Сохранить 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 для добавления, удаления узлов, например:

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.100.74

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

Важным отличием между 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.

В OT есть подходы, которые поддерживают SGML (расширенный набор XML), но реализации не существует. Поэтому это не невозможно! Хотя, я согласен, OT - не лучший подход для включения XML. Это потому, что OT был разработан для линейных структур данных. Но HTML/XML намного сложнее: у него есть атрибуты, и он построен как дерево. Тот факт, что это дерево разрешимо, но атрибуты - которые реализованы как упорядоченный ассоциативный массив - не поддерживаются OT. Просто потому, что ассоциативные массивы не поддерживаются OT (на данный момент). Приведенный выше подход фактически рекомендует рассматривать атрибуты как строку: например, id='myid' value='mystuff' 'Но вы можете легко нарушить весь синтаксис вашей' attribute-string', когда один пользователь удаляет все атрибуты, и другой вставляет "символ непосредственно после"mystuff". Это может разрешить в некотором теге div, который выглядит следующим образом <div ">, который не является допустимым синтаксисом.

Может быть, это вас интересует

CEFX - это проект, который нацелен на поддержку XML - он мёртв, насколько мне известно. Но он использует подход ОТ. По некоторым причинам невозможно редактировать строку - только элементы XML.

Google Drive SDK поддерживает графические структуры данных. Это, однако, частная собственность, и никто не знает, как это работает.

Я разрабатываю структуру, которая поддерживает произвольные структуры данных. В настоящее время поддерживаются Text, Json, XML и HTML. У этого есть другой подход: проверьте это: Yatta!

Кстати, то, что описал протокол Wave и Эрик Дречсел, известно как аннотации в OT. Обычно он используется для поддержки форматированного текста.