- PVSM.RU - https://www.pvsm.ru -
Много лет меня преследовал этот зуд — попытки найти «идеальный» текстовый редактор для совместной работы. Но не просто любой текстовый редактор, который поддерживает совместную работу, о нет, моя задача — найти (ну, по крайней мере, искать) открытые текстовые редакторы с групповой работой в режиме реального времени (т. е. не только обычный текст, но и структурированный контент). Таким образом, основное внимание в этой статье уделяется довольно нишевой категории инструментов с открытым исходным кодом и технологиям, на которых они работают. Если ваши интересы шире, можете обратиться к этому постоянно обновляемому списку редакторов [2].
Итак. Я много раз прыгал с обрыва и нырял в практически бесконечное море программ для совместной работы в реальном времени. Полёт вниз, этот бодрящий нырок на дно бассейна, мне уже хорошо знаком. Обычно он начинается с некоторого первоначального волнения и удивления (скачок) новых низкоуровневых технологий и исследовательских работ, затем следует чувство перегруженности и желания всплыть (эй, тут довольно глубоко) и исследовать прикладную часть, а затем период, когда мои мысли лучше всего описать фразой: «Я действительно настолько глуп для этого?» (вполне вероятно), потому что обычно документация, демо и код не совсем совпадают или имеют смысл, компонент совместной работы на сервере не запускается и встречаются пограничные ситуации, когда более двух пользователей вводят одно и то же слово, и… на этом всё заканчивается (всплыл, хватая ртом воздух).
После этого трудно снова поднять тему, следующий этап — это своего рода зима размышлений, в дрёме, пережидая суровую погоду, когда я обычно позволяю полуготовому коду работать месяцами… или годами. Пока мы не встретимся снова, бесконфликтный реплицированный тип данных!

Рис. 1. Прыжок
Дело в том, что в 2017 году я был так взволнован перспективами одного алгоритма (разновидность CRDT [3]), описанного в исследовательской статье [4], что потратил несколько дней и реализовал его на JavaScript [5], только чтобы узнать, что в самой научной статье есть пограничная ситуация, для которой не приведено решения (хорошо… но может всё-таки?). Я в то время обратился к автору, но не получил ответа, и обнаружил, что эта конкретная пограничная ситуация рассмотрена в аналогичном алгоритме другой командой, но чёрт, из-за этих тонкостей в реализации, возможно, я мог бы перенести его на Lisp… ТАК, СТОП! Что здесь происходит? Я, конечно, не хочу внедрять новый алгоритм из исследовательской работы и исправлять его проблемы! Что я делаю, как я сюда попал? Давайте перемотаем обратно!
То, что мне (и, вероятно, вам тоже, дорогой читатель) действительно нужно — это редактор plug-and-play, готовый продукт. Который решает проблему совместной работы в реальном времени. Который позволяет нескольким подключённым пользователям за тысячи миль друг от друга редактировать структурированный документ, нажимая клавиши на клавиатурах, и видеть изменения друг друга на своих экранах. Вот и всё. Однако редакторы — это сложно... и я никак не мог найти такого инструмента.
До сих пор.
Наступил 2019 год (зуд вернулся с силой), и на этот раз не только появился волшебный редактор, но на самом деле даже два претендента на выполнение долгожданной спецификации. Первоначально я хотел полетать с вами над полем и перечислить почти все текстовые редакторы для совместной работы, но, похоже, это не добавит большой ценности [6]. Вместо этого давайте сосредоточимся на двух редакторах, которые могут стать «тем самым».
Но редакторов два, и нужно сделать выбор — было бы неплохо объективно рассмотреть, какой из них действительно лучше подходит. Предлагаю глубоко научную систему классификации со следующими категориями (используя киви в качестве стандартной единицы добра):
(это также критерий исключения)
(то есть вы можете видеть курсоры других пользователей)
(это довольно сложно определить)

С такой системой подсчёта очков редактор может получить максимум 11 киви-единиц добра. Давайте приступим!

Рисунок 2. Интерфейс CKEditor 5 (один из возможных вариантов), источник [7]
Начнём с CKEditor 5, последней версии из большой линейки качественных редакторов [8]. Он прекрасен. Я знаю, знаю, что это не критерий, и он в реальности не имеет значения (и мы можем даже не согласиться), но я просто должен был сказать о его красоте. Итак, этот редактор берёт много киви: он лицензирован под GPL (некоторое обсуждение ограничений здесь [9]), (+1), поддерживает изображения, таблицы, списки (+3), математика поддерживается плагином (+1) и он также поддерживает совместную работу в реальном времени [10] с удалённым курсором и выделениями (+2). Создатели CKEditor написали удивительный подробный пост в блоге о том, как они его разработали [11] с помощью операционных преобразований.
Тем не менее, я не смог найти необходимую реализацию сервера для совместной работы в реальном времени, а вся документация указывает на обязательную необходимость их облачного сервиса и (платного) компонента даже в проектах, совместимых с GPL.
Уровень офлайновой поддержки трудно определить [12], но похоже, что она не совсем полная (например, редактор выдерживает ненадолго прерванное подключение, но не несколько дней работы в автономном режиме). Наверное, половина киви? То же самое касается мобильной поддержки, там также ведётся работа по полной поддержке (+0,5). И последний момент, CKEditor, безусловно, используется в продакшне, но я не смог найти список продуктов на его основе (+0,5).
Хороший редактор, но отсутствие доступного сервера совместной работы с открытым исходным кодом действительно удручает.
Полная оценка: 8,5/11 









Рис. 3. Atlaskit Editor от Atlassian
Около года назад Atlassian запустила систему Atlaskit Design [13] с открытым исходным кодом, и с ней пришло много вкусностей, в том числе полноценный готовый к использованию редактор на основе ProseMirror [14]. Я уже чувствую, что это может быть тот редактор, который мы искали! Он выпущен под лицензией Apache 2.0, по мнению многих, очень разрешительной лицензией open source [15] (+1 киви). Он не только поддерживает изображения, таблицы и списки, но поддерживает их исключительно хорошо (+3 киви)! Реализация таблиц, чего очень не хватает большинству редакторов, тот выполнена прекрасно:

Рис. 4. Управление таблицами в Atlaskit Editor
К сожалению, математика не поддерживается, но сам редактор основан на ProseMirror, так что не должно стать проблемой добавить к нему существующее решение (+0,5). Он определённо поддерживает совместную работу в реальном времени с удалёнными курсорами и выделениями (+2), это из лучших примеров UI такой поддержки, какие я когда-либо видел (например, удалённые курсоры затемняются, если перекрываются с вашими собственными, и другие прекрасные детали реализации). Кроме того, из моего тестирования поддержка работы в офлайне кажется очень прочной (+1) — вероятно, это связано с подходом «центральной компетенции», который использует для совместной работы ProseMirror [16]. Ничего себе, мы уже добрались до 7,5 киви, а ещё много пунктов! Вперёд!
К сожалению, именно здесь мы немного сталкиваемся с суровой реальностью. Как и в CKEditor, здесь нет доступной серверной реализации для совместной работы в реальном времени. Лентяи. Крупный облом. Интересно, можно ли это исправить?..
Во всяком случае, если продолжать спускаться по критериям, то всё остальное достойно киви: он абсолютно точно используется в продакшне (миллионы пользователей), и у него есть мобильная поддержка (+2). Как раз когда я собирался объявить победителя (в общей сложности 9,5 киви) и опубликовать этот пост, появилось что-то ещё. Оказывается, логотипы и значки, используемые в редакторе, и многие другие компоненты Atlaskit лицензированы под очень ограничительной лицензией ADG [17], в которой говорится, что вы не можете использовать их за пределами вселенной Atlassian. Однако те же иконки широко используются и плотно интегрированы в редактор. Крупный облом номер два, и я забираю у них киви. Мы вернулись к 8,5, и если вы ведёте подсчёт, то видите, что результат теперь одинаковый. И он окончательный.
Вот если бы что-то сделать с этими иконками...
Я подумал, что после всех последних достижений в области онлайновых текстовых редакторов будет очень печально остаться с двумя великолепными редакторами с удивительными функциями, которые всё равно нельзя использовать в проектах с открытым исходным кодом — либо из-за проблем лицензирования, отсутствия доступных строительных блоков, либо и то, и другое.
Поэтому сначала я разработал серверную часть (на основе PostgreSQL, фреймворке PubSweet и смеси REST/WebSockets), код доступен здесь [18]. Он довольно простой, но выполняет свою работу и обеспечивает сохраняемость документов и канал связи в реальном времени. Удивительно, но благодаря огромному сообществу ProseMirror я смог выяснить, как всё должно работать, не имея точной спецификации интерфейса (+1 киви).
А затем я заменил иконки, используемые редактором, значками из набора Feather [19]. В частности, пришлось заменить три пакета. Поскольку лицензия ADG, среди прочего, запрещает любые производные работы, то эти пакеты нужно было переделывать с нуля. Вероятно, из-за этого потерялись некоторые функции, в основном, с точки зрения доступности для людей с ограниченными возможностями, но зато создана хорошая открытая база для дальнейшего развития. Например, в некоторых случаях для значков отсутствуют лучшие альтернативы [20], так что если вы хотите внести свой вклад в этот проект, вот вам первая проблема (+1 киви)!
Всё это означает, что теперь мы всего в половине киви от идеального результата (но мы, вероятно, сможем справиться с математикой). Свершилось то, во что я не верил, когда начинал это путешествие. Это также означает, что у нас есть явный победитель в этой битве, и в конечном итоге Atlaskit Editor победил благодаря разнообразному, открытому и полезному сообществу ProseMirror. Ознакомьтесь с документацией проекта [21] для получения инструкций, с чего начинать. Я считаю, что если вы начинаете новый проект и рассматриваете возможность сотрудничества в реальном времени, это отличное место для начала, даже со всеми оговорками [22].
Рис. 5. Демонстрация возможностей редактирования в режиме реального времени в Atlaskit Editor
Итоговый (исправленный) результат: 10,5/11 










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

Рис. 6. Редактор Wax (текстовый процессор на основе ProseMirror)
Первый — это Wax (назван в честь древних восковых табличек) от Coko Foundation. Этот текстовый процессор [23] сначала сделали на библиотеке Substance [24] (репозиторий [25]), а теперь перестроили под ProseMirror [14] (репозиторий [26]). Он исключительно упакован функциональностью. Это не совсем те функции, за которые мы даём киви, но тем не менее это отличные функции. Wax изначально построен для вёрстки книг [27], он поддерживает заметки (нумерованные аннотации, распространённые в книгах), историю изменений, поиск и замену, орнаменты и другие. Может, за это давать апельсины
? В этом случае Wax получит 4 киви (открытая лицензия, изображения, списки, использование в продакшне) и пару апельсинов, возможно, четыре. 






. Это много фруктов!

Рис. 7. Texture, редактор на основе Substance
Наконец, у нас есть Texture [28], очень специфический, профессиональный (но с открытым исходным кодом) редактор для создания научного контента в формате JATS (стандарт XML для журнальных статей). Если тут поупражняться в подсчёте фруктов, у нас почти наверняка закончатся пальцы: открытая лицензия, таблицы, изображения, глубокая поддержка математики, ссылки и перекрёстные ссылки, списки, поддержка метаданных, список продолжается! 

Повторяю, и Wax, и Texture — замечательные редакторы, и единственное, что удерживает их от максимального количества киви — это отсутствие функций совместного редактирования в реальном времени, чему посвящена эта статья.
Если вы создаёте систему, в которой ключевым компонентом является совместное редактирование в реальном времени, вы выбрали правильное время. В прошлом году ландшафт созрел, и теперь здесь появились почти [29] plug-and-play открытые решения. Возможно, с вашей помощью ровно через год у нас будет целый набор открытых проектов. И возможно, только возможно, мы также будем использовать инструменты, построенные поверх этих открытых слоёв, даже не зная об этом.
Автор: m1rko
Источник [30]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/317206
Ссылки в тексте:
[1] Image: https://habrastorage.org/webt/c3/t8/tm/c3t8tmu2egtlctxmr6wbnc40k-s.png
[2] постоянно обновляемому списку редакторов: https://github.com/JefMari/awesome-wysiwyg
[3] CRDT: http://archagon.net/blog/2018/03/24/data-laced-with-history/#conflict-free-replicated-data-types
[4] исследовательской статье: http://dx.doi.org/10.1016/j.aei.2016.10.005
[5] на JavaScript: https://github.com/jure/rgass
[6] не добавит большой ценности: https://duckduckgo.com/?q=collaborative+open+source+text+editor
[7] источник: https://ckeditor.com/docs/ckeditor5/latest/builds/guides/overview.html#available-builds
[8] большой линейки качественных редакторов: https://ckeditor.com/
[9] некоторое обсуждение ограничений здесь: https://github.com/ckeditor/ckeditor5/issues/991
[10] совместную работу в реальном времени: https://ckeditor.com/docs/ckeditor5/latest/features/collaboration/real-time-collaboration/real-time-collaboration.html?docId=edef3b3c3cda4a0d2e5d85433e8815cea
[11] подробный пост в блоге о том, как они его разработали: https://ckeditor.com/blog/Lessons-learned-from-creating-a-rich-text-editor-with-real-time-collaboration/
[12] Уровень офлайновой поддержки трудно определить: https://news.ycombinator.com/item?id=18232655
[13] Atlaskit Design: https://atlaskit.atlassian.com/
[14] ProseMirror: https://prosemirror.net/
[15] очень разрешительной лицензией open source: https://tldrlegal.com/license/apache-license-2.0-%28apache-2.0%29
[16] подходом «центральной компетенции», который использует для совместной работы ProseMirror: http://marijnhaverbeke.nl/blog/collaborative-editing.html
[17] лицензией ADG: https://atlassian.design/server/license/
[18] здесь: https://github.com/jure/pubsweet-blogger/blob/master/server/component-atlaskit-collab/src/collab.js
[19] набора Feather: https://feathericons.com/
[20] в некоторых случаях для значков отсутствуют лучшие альтернативы: https://github.com/jure/pubsweet-blogger/blob/master/app/components/component-atlaskit-editor/icon/build.js
[21] документацией проекта: https://github.com/jure/pubsweet-blogger
[22] оговорками: https://github.com/jure/pubsweet-blogger/blob/master/README.md
[23] текстовый процессор: https://www.adamhyde.net/html-word-processors/
[24] Substance: https://github.com/substance/substance
[25] репозиторий: https://gitlab.coko.foundation/wax/wax
[26] репозиторий: https://gitlab.coko.foundation/wax/wax-prosemirror
[27] вёрстки книг: https://editoria.pub/
[28] Texture: http://substance.io/texture/
[29] почти: https://github.com/jure/pubsweet-blogger/
[30] Источник: https://habr.com/ru/post/451204/?utm_source=habrahabr&utm_medium=rss&utm_campaign=451204
Нажмите здесь для печати.