Это настоящая кроличья нора и, в основном, из-за ситуации с форматом документов, используемом в прошлом или настоящем в MS Office на данный момент. Того самого OOXML (Office Open XML), формата от Microsoft для файлов .docx, .xlsx, .pptx — не только текст, но и таблицы, диаграммы с презентациями (spreadsheets, charts, presentations).
LibreOffice
создавался вокруг ODF-формата, а поддержка OOXML была добавлена с боку-припёку. И это не метафора, вся работа с документами (DOM, Document Object Model) выстроена через сущности ODF-формата. Приложения LibreOffice не могут работать с OOXML без предварительной конвертации документа в ODF, производящейся скрытно от пользователя при открытии файла. Если же документ отредактирован и требуется его сохранение в OOXML, то всё его представление подвергается повторной конвертации.
ONLYOFFICE / Р7-Офис
проектировался изначально на работу с OOXML, и не просто так, а Transitional-вариантом (ISO/IEC 29500 Transitional). Т.е. вокруг реферс-инженеринга того поведения, которое демонстрирует MS Office в определённых ситуациях. Это можно назвать стремлением или погоней за обратной совместимостью. Всё ради того, чтобы пользователи наблюдали одинаковое единообразное отображение документа. Работа с элементами и сущностями документов (DOM) выстроена вокруг OOXML, как основного средства и способа работы с документами, симметрично тому, как с ODF внутри LibreOffice.
МойОфис / MyOffice
использует как бы свою собственную DOM, не ориентированную на ODF или же OOXML и создавался без однозначной привязки к какому-либо формату. Изрядное количество внимания уделено и ожидаемому пользователем совместимости поведения с MS Office. Так же изрядным образом обыгран вопрос управления DOM в условиях одновременной работы над документом нескольких пользователей (есть свой отдельный сервер для коллективной работы).
Облака и онлайн
Для работы с документами в веб-браузерах, внедрения в различные онлайн-сервисы, удачно и органично выглядит именно ONLYOFFICE / Р7-Офис, поскольку изначально реализован вокруг JavaScript. По сути своей, крайне сильно напоминая тот самый VSCode, из которого легко и просто получилось Cloud/Online IDE для GitHub.
МойОфис / MyOffice же, напротив, реализован на C++ и работать в браузерах может лишь через компиляцию кода в WASM — это приводит к ещё более выраженной однопоточности, нежели идея вокруг workers в кодовой базе на JavaScript.
Исходя из этого всего и не удивительно, что Euro Office было решено создавать принудительно присвоив себе именно ONLYOFFICE / Р7-Офис — и формат OOXML Transitional поддерживает и в различные онлайн-сервисы удобно внедрять.
Два разных Office Open XML
Существует OOXML аж в двух вариациях: Strict и Transitional, оба являются частью ISO/IEC 29500. Деление это обусловлено ситуацией вокруг MS Office и однозначно отражено архитектурой спецификации OOXML (ISO/IEC 29500)
- Часть 1: Основы и справочник по языку разметки (Strict), около 4500–5000 страниц, это структура XML для текста, таблиц и презентаций.
- Часть 2: Open Packaging Conventions (OPC), около 150 страниц, как упаковывать XML-файлы в ZIP-архив.
- Часть 3: Совместимость и расширяемость разметки, около 40 страниц.
- Часть 4: Особенности переходной миграции (Transitional), около 1500 страниц.
OOXML Strict
Использование ориентировано для долгосрочного (архивного) хранения документов. Полностью запрещены старые бинарные элементы внутри документов. Известные ошибки MS Office были исправлены по математическим и логическим нормам. А для формул или различных спецсимволов используется Unicode.
OOXML Transitional
Нужен для перехода со старых форматов .doc, .xls, .ppt. Внутри документов разрешены старые бинарные элементы из 90-х. Известные ошибки MS Office описаны и узаконены как нюансы во имя совместимости. Использует десятки «флагов совместимости» описывающие не логику разметки, а указывающие отображать документ с определёнными нюансами/ошибками/нормами устоявшимися когда-то в прошлом во времена MS Office.
Примеры различий Strict и Transitional
Графические фигуры и диаграммы могут быть описаны как на базе DrawingML (современном стандарте для векторной графики).
Так и с использованием VML — типичном для конвертации старых .doc файлов, необходимость в котором отсутствует в Strict, но выплывает в ряде случаев из Transitional.
Так же поддержка старых макросов, именно Transitional сохраняет полную поддержку VBA (Visual Basic for Applications). Что завязано на внутреннее устройство как Windows, так и нюансы API MS Office.
Маркеры списков, стрелочки в Transitional-файлах могут прописываться ссылками на проприетарные шрифты (Wingdings или Symbol). Когда таких шрифтов нет в системе, то получаются пустые квадраты или случайные буквы.
Примеры ошибок
Тот же 1900 год считается високосным в OOXML Transitional — так повелось со времён Lotus 1-2-3, который родом из 1980-х и на замену которому MS Excel продвигался. Известная вещь, происхождение хорошо задокументировано и случившаяся ради производительности (есть у Джоела Спольски, как отдельная история о появлении Visual Basic for Applications).
Требовалось уместить Lotus в 640 Kбайт – не так много памяти. Если не обращать внимания на 1900 год, то можно проверить год на високосность по двум правым разрядам числа – они должны быть нулевыми. Быстро и легко. Наверное, ребята из Lotus решили, что ничего не случится, если какие-то два месяца в далеком прошлом будут считаться неправильно.
Вот в случае OOXML Strict сдвинута точка отсчёта на 30/31 декабря 1989, так же как было всегда в Visual Basic, но сдвинутая на один день по сравнению с MS Excel.
Есть и другие альтернативы MS Office, про них уже было в контексте того, что Microsoft ворует файлы отсылая к себе в облако без спроса. Но у них будут ровно такие же проблемы вокруг слабой распространённости OOXML Scrict и необходимости реализовывать OOXML Transitional как сам по себе, так и посредством «обратной инженерии».
#ooxml #LibreOffice #МойОфис #Р7-Офис #ONLYOFFICE #r7-office #onlyoffice #officesuite #opensource #software #lang_ru @Russia



🍉

