Как ONLYOFFICE помирил два поколения формул Microsoft

Когда мы разрабатывали наши редакторы документов, мы хотели дать пользователю возможность удобно работать с любым объектом. Одним из препятствий, возникших на пути к редактированию всего и сразу и прямо в этом окне, стали формулы, а точнее — их двойственность. Студенты технических вузов сталкивались с этим явлением почти со стопроцентной вероятностью: речь идет о существовании «старых» (бинарный .doc) и «новых» (прогрессивный XML) формул в редакторах пакета MS Office.

В этой статье мы расскажем, как эта проблема решается в редакторах ONLYOFFICE. Ответ прост: К — «Конвертация». Мы конвертируем старые формулы в доступные для редактирования новые формулы и крайне довольны своей идеей. Почему мы пошли таким путем и как устроена конвертация, читайте далее.

7b333bc99a344b7c97106a3850514367.jpg

В редакторах Microsoft до сих пор можно набирать формулы двух разных форматов.

Старый формат формул — это формулы, которые создавались в MS Office до 2007 года с помощью надстройки Microsoft Equation. Например, чтобы создать такую формулу в Word’е, пользователь вызывает сторонний редактор через меню (ВставкаОбъектMicrosoft Equation). По этой команде открывается редактор формул, который на самом деле является урезанной версией программы Math Type от компании Design Science.

Таким образом, старые формулы являются объектами OLE. Word просто отдает определенную область документа другому приложению, даже не подозревая, чем это приложение в ней занимается. После закрытия MS Equation Word относится к созданным в нем формулам как к картинкам, встроенным в текст. Их нельзя отредактировать в самом тексте — нужно вновь вызывать редактор формул.

В 2007 году начался переход на docx. Вместе с ним у Microsoft появился свой редактор формул, возможности которого гораздо шире. Во-первых, в нем больше математических символов и шаблонов. Во-вторых, новый редактор позволяет Word’у работать с формулами как с частью текста, а не как с картинками. Таким образом, новый редактор формул — это WYSIWYG редактор.

Казалось, что жизнь математиков и все, кому нужны были формулы, должна была упроститься с появлением нового редактора. Но возникла проблема. Переход на формат docx не произошел мгновенно — остался большой массив документов в формате doc. Более того — многие упорно продолжают сохранять документы в doc. И это неудивительно — у многих остались старые компьютеры и старые версии MS Office.

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

  • Два редактора. Microsoft на всякий пожарный держит два редактора формул — новый на панели инструментов и старый по тому же адресу (меню ВставкаОбъект). Логично, что старый редактор уже не развивается. Он просто существует на случай открытия документа в формате doc или файла docx, содержащего старые формулы.
  • Ноль редакторов. Онлайн-версия Word’а формулы не поддерживает в принципе. Она покажет их в просмотрщике, но в режиме редактирования на месте формул будет показана загадочная надпись «Equation».
  • Поддержка новых формул. Google Docs отображает старые формулы картинками, а новые позволяет редактировать. О подходе Google к редактированию формул мы писали в одной из предыдущих статей. Если кратко, то редактирование сложных формул в этом редакторе физически невозможно. Во-первых, создавая формулы, пользователь работает в одной строке (нельзя работать с матрицами, системами уравнений и т.д.). Во-вторых, чтобы отобразить или набрать формулы используются символы существующих шрифтов.
  • Конвертация в собственный формат. OpenOffice конвертирует оба типа формул в свой собственный формат и работает исключительно с ним.

Естественно, мы хотели поддерживать оба типа формул. В то же время нам казалось логичным брать за основу именно новые формулы. Нашим основным форматом всё-таки является docx.

Нам не хотелось делать два редактора, как Microsoft, — это ресурсозатратно и бесперспективно. К тому же, мы и так можем идеально отобразить старые формулы, сохраненные в docx. Писать отдельный редактор для них было бы совсем странно, и вот что мы решили: даем пользователю делать с новыми формулами всё, что он хочет, а старые показываем в виде векторных картинок. Но это не значит, что теперь он ничего не сможет в них поменять — одно элегантное движение мышкой (также известное как двойной щелчок) и старые формулы сконвертируются в новые, полностью доступные для редактирования.

Старая формула хранится в документе docx в двух вариантах — в виде векторной картинки wmf и в виде OLE объекта (бинарника со старой формулой). Если к нам в документе пришла старая формула, мы показываем её как картинку, такую, как записал Word. Поэтому в редакторах ONLYOFFICE файл со старыми формулами откроется точно также как и в Word’е.

При конвертации кое-что в форматировании может поехать, т.е. измениться, поскольку форматы старых и новых формул кардинально отличаются. Но это легко можно поправить, ведь теперь все объекты документа доступны для редактирования.

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

Здесь нас можно назвать оригинальными: никто не конвертит старый формат в новый вообще. Даже Word. Редакторы ONLYOFFICE позволяют поправить формулы в doc, затем перевести всё в docx и больше никогда не думать об этом.

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

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

Например, рассмотрим систему из трех уравнений в старом формате

4bd9b5ccca1e4806831d602a7c58a2fc.png

Для уравнений задается выравнивание по левому краю (по центру/по правому краю) в новом формате такого выравнивания нет (уравнения размещаются по центру)

b5d1f6e6b1834758979f1f2be8796246.png

Чтобы реализовать выравнивание по левому краю в новых формулах достаточно поставить & в начало каждого уравнения. Увеличив минимальное расстояние между опорными линиями, получим

8c82919045494dcca853584ed130cedc.png

В принципе приемлемый результат конвертации. После конвертации, если нужно, можно еще немного подредактировать систему, разместив & в нужных местах перед переменными, получим результат, который сложно сделать в старых формулах

84d98cc25aa646dab5693f41bc0d7855.png

Мы старались сделать работу с формулами максимально удобной для пользователей ONLYOFFICE и вполне довольны результатом. Надеемся, что, сделав конвертацию формул старого формата в новый, мы внесли свой вклад во всеобщий переход на docx. Просто забирайте формулы из doc’ов и больше никогда туда не возвращайтесь.

А еще — мы не перестаем улучшать наши редакторы. Главным приоритетом в ближайшее время станет работа над сносками. Кроме того, совсем скоро выйдет большой пакет обновлений по всем модулям ONLYOFFICE. В числе главных — предоставление документа docx c правами на рецензирование (оно появилось еще в версии редакторов 3.6, но теперь работать с ним стало еще удобнее). В общем, оставайтесь с нами  :)

© Habrahabr.ru