GSoC2011: поддержка файлов Visio в LibreOffice

Обещанную серию публикаций по итогам Google Summer of Code 2011 просим считать открытой. Символическую ленточку перерезает интервью с авторами библиотеки libvisio, обеспечившими поддержку файлов VSD (двоичные документы Microsoft Visio) в LibreOffice.

Прелюдия

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

Зачем же их тогда поддерживать? Просто бизнес не любит апгрейды. У дизайнеров обычно завалы клипарта в самых разных форматах, крупные издательские дома до сих пор сидят на DOC и даже не думают переходить на DOCX, а системные интеграторы то и дело отправляют клиентам схемы в VSD вместо VDX.

И если DOC давным-давно изучен вдоль и поперёк, то с Visio проблема состоит в том, что Microsoft никогда и ничего толком не публиковали про формат файлов VSD. Для того, чтобы его расколдовать, нужны совершенно по-особому устроенные мозги, владелец которых готов с радостью тратить кучу времени на то, что даже законченным «ботаникам» кажется невероятно нудной работой. Абсолютное большинство разработчиков скорее застрелится, чем возьмётся за реверс-инжиниринг, и их можно понять.

Будучи участником команды re-lab, маленькой и скромной как тысяча кровавых диктаторов, я, само собой, пристрастен в выборе объектов для нового интервью. Но раз сообщество весьма положительно отозвалось о первых результатах работы по реализации поддержки документов Visio в LibreOffice, так тому и быть.

Приветствуем Эйлид МакАдам (Eilidh McAdam) и её руководителя Фридриха Штрбу (Fridrich Strba), которые за прошедшее лето написали ни много ни мало целую библиотеку для чтения файлов Visio и основательно пропатчили LibreOffice. Особо нетерпеливым дальше-не-читастам сообщаем, что поддержка VSD для общего пользования появится в LibreOffice версии 3.5, выпуск которой намечен на 8 февраля 2012 года.

Интервью

Привет! Расскажите немного о себе.

Эйлид: Мне 24 года, у меня степень бакалавра по вычислительным системам от Абертейского университета, Шотландия, где я сейчас работаю над докторской, пытаясь понять, как можно перенести устойчивость биологических сетей на компьютерные сети, чтобы решить критические инфраструктурные проблемы. На IRC меня можно найти под ником Tibby Lickle.

Фридрих: Мне 42 года, и я работаю в Attachmate/SUSE (ранее часть Novell) над LibreOffice. У меня жена и трое детей, который как-то очень уже быстро растут. Ещё у меня степень магистра по теории вычислительных машин и систем от словацкого университета, про который вы всё равно никогда не слышали (University of Zilina), степень бакалавра по международным отношениям от Женевского университета и степень магистра по международному праву от Института международных исследований в Женеве.

Фридрих, как долго ты работаешь над OpenOffice.org/LibreOffice и на чём специализируешься?

Я присоединился к проекту в 2005 году, когда Майкл Микс (Michael Meeks) помог нам интегрировать фильтр импорта WordPerfect (на основе libwpd) в OpenOoffice.org. Поскольку другие участники нашей команды вскоре отошли от дел, я стал сопроводителем этого кода в OOo. Первым проектом GSoC в OOo я начал руководить уже в 2006 году. Кстати, это был проект по реализации импорта формата графики :) В 2007 году я пришёл в Novell для работы над OOo, а затем GoOo и LibreOffice.

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

Эйлид, для тебя это первый опыт работы над проектом с открытым исходным кодом?

По большому счёту, да. В начале года я решила, что пора наконец как-нибудь отблагодарить сообщество, и решила начать с LibreOffice. Первый патч был типичным однострочником: он отключал в Calc кое-какую автозамену. Сразу после этого я совершенно случайно заметила объявление об участии в Google Summer of Code и, конечно, не удержалась.

Почему ты выбрала именно этот проект?

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

Сейчас, когда проект GSoC завершён, насколько хорошо работает импорт VSD в LibreOffice?

Фридрих: Без тени ложной скромности — чертовски хорошо. Поддерживаются все геометрические примитивы и почти все типы заливки; есть начальная поддержка текста. Разумеется, речь не идёт об идеальной поддержке формата — мы же всё-таки о софте говорим. Но понимаются все возможности формата Visio, которые можно легко спроецировать на SVG и ODG.

Original network diagram in Visio

Network diagram converted to ODG

Эйлид: В принципе, Фридрих достаточно точно ответил на вопрос. Мы сделали намного больше чем предполагали сделать в начале. Поддержка NURBS (которых нет в SVG и ODG) и стилей со стенсилами — в каком-то смысле, даже предмет гордости. Но лучше всего судить о результате могут, конечно, только пользователи.

Эйлид, что для тебя было самым сложным в проекте?

Ты знаешь, он был в принципе непростым, с самых разных точек зрения. Например, структурировать крупный проект и работать с другими программистами (и не только ними) было для меня в новинку. К счастью, у меня был отличный руководитель, который прекрасно в этом разбирается :)

Какой ценный опыт ты приобрела за время работы?

У меня такое чувство, что я узнала больше чем за всё время учёбы в университете! Как работать с удалённой командой (ключевой навык — коммуникация, что в равной степени относится и к работе с локальной командой), насколько перфекционизм может мешать работе и как важно вовремя демонстрировать результаты. Ещё я узнала о разных взглядах на структуру проекта. О, и ещё я теперь знаю, насколько критически важны GDB и Valgrind.

Ты планируешь участвовать в разработке LibreOffice сверх проекта GSoC?

Эйлид: Моё участие в проекте началось с желания отблагодарить таким образом сообщество, и желание это никуда не делось. Хотя у меня впереди ещё защита докторской, libvisio стал для меня любимым проектом. Я вложила в него слишком много сил, чтобы вот так просто от него отказаться. Сообщество LibreOffice состоит из прекрасных людей, и я хотела бы и дальше быть его частью.

В VSD остаются некоторые возможности, которые не к чему привязать в LibreOffice. К примеру, в LibreOffice нет палитры стенсилов. Вряд ли имеет смысл дописывать новые функции только ради того, чтобы обеспечить максимальную поддержку VSD, но есть ли что-то в любом случае достойное реализации?

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

Фридрих: Чисто технически это выглядит как сброс содержимого стенсила в многостраничный файл ODG, по стенсилу на страницу. Если кто-нибудь захочет написать реализующий это патч, мы его, конечно же, примем (при условии, что он толково подготовлен). Просто помните, что мы обеспечиваем поддержку Visio, а не пытаемся его заново написать под видом LibreOffice Draw.

Фридрих, есть ли у команды LibreOffice планы по реализации экспорта в VSD?

В LibreOffice мы меньше занимаемся планами и больше — патчами. Пока что я не слышал о желающих реализовать экспорт файлов Visio. Я даже не уверен в том, что это так уж важно. Но если кому-то захочется это сделать, не вижу причины для возражений.

Тем не менее, я бы хотел в первую очередь обратить внимание на необходимость реализовать поддержку VDX и завершить уже начатую работу над импортировщиком VSD, поскольку то, что нельзя импортировать, нельзя и экспортировать. Чем больше возможностей формата LO поддерживает при импорте, тем меньше он теряет при обратном сохранении.

По опыту знаю, что пользователи склонны ждать от софта поддержки максимального количества чужих форматов. При этом разработчики СПО склонны вместо этого отсылать всех к стандартам вроде OpenDocument. Как вы решаете этот конфликт в проекте LibreOffice?

Фридрих: Не думаю, что у нас эта проблема присутствует в явном виде. Поддержка экзотических форматов в LibreOffice является одной из достаточно приоритетных задач.

Самой собой, проще всего не ждать у судьбы милости и попробовать реализовать поддержку нужного формата самостоятельно. Даже если патч не идеален, он будет внимательно рассмотрен сообществом, которое поможет автору внести нужные исправления и влиться в команду.

Факты, просто факты

Начальная работа по реверс-инжинирингу VSD была выполнена Валей Филипповым в 2007 году и привела к созданию программ vsdump и vsdviewer, ныне покойных. Вместо них для разбора VSD при разработке libvisio используется программа OLE Toy, которая поддерживает чтение и других проприетарных форматов.

Работа над libvisio была начата в мае и завершена в августе 2011 года шотландской студенткой Эйлид МакАдам в рамках программы Google Summer of Code.

Пик коммитов приходится на июнь 2011 года, что объясняется рефакторингом кода и добавлением поддержки различных примитивов. Как правило, это 95% работы, занимающей 5% общего времени. Дальнейшая работа, заключавшаяся преимущественно в реализации поддержки NURBS, стилей и стенсилов, не привела к написанию большого объёма кода, но существенно повлияла на качество импорта. Сейчас команда вносит в код лишь эпизодические изменения.

Commits to libvisio

Основными разработчиками остаются Фридрих и Эйлид, некоторое количество патчей поступило и от Вали. Падение количества участников на графике ниже объясняется требованием Google свернуть разработку в середине августа для подготовки последнего отчёта.

Committers to libvisio

В проекте сейчас примерно 6500 строк кода на C++, не считая кода сборочной среды.

Code growth in libvisio

В состав библиотеки libvisio входит утилита vsd2xhtml, которая встраивает SVG в XHTML. Утилита vsd2odg входит в состав пакета writerperfect. LibreOffice из Git просто открывает VSD.

На момент публикации статьи библиотека libvisio поддерживает:

  • все геометрические примитивы и команды, включая MoveTo, LineTo, PolylineTo, ArcTo, EllipticalArcTo, Ellipse, NURBSTo;
  • заливки (сплошные, градиентные, прозрачные), обводки и стили обводок (не без проблем);
  • чтение формата и ориентации страниц, многостраничные диаграммы;
  • текст, включая базовое форматирование (кегль шрифта, полужирное и курсивное/наклонное начертания);
  • преобразования вроде вращения и зеркального отражения (работает и для групп);
  • группы объектов;
  • встроенный растр.

LibreOffice в принципе не поддерживал такой геометрический примитив как эллиптические дуги, типичные для стенсилов Visio. Команде пришлось реализовать аппроксимацию этих дуг в четыре кубических сплайна. Функция будет доступна пользователям LibreOffice 3.5; пользователей vsd2odg и LibreOffice 3.3-3.4 ждёт малоприятный сюрприз.

Сборка

Если вам не занимать храбрости, вы можете собрать написанные конвертеры для личного пользования.

1. Скачайте, соберите и установите libwpd:

$ git clone git://libwpd.git.sourceforge.net/gitroot/libwpd/libwpd
$ cd libwpd
$ ./autogen.sh && ./configure && make && sudo make install

2. Скачайте, соберите и установите libwpg:

$ git clone git://libwpg.git.sourceforge.net/gitroot/libwpg/libwpg
$ cd libwpg
$ ./autogen.sh && ./configure && make && sudo make install

3. Скачайте, соберите и установите libvisio:

$ git clone git://anongit.freedesktop.org/libreoffice/contrib/libvisio
$ cd libvisio
$ ./autogen.sh && ./configure --prefix=/usr && make && sudo make install

4. Скачайте, соберите и установите writerperfect:

$ git clone git://libwpd.git.sourceforge.net/gitroot/libwpd/writerperfect
$ cd writerperfect
$ ./autogen.sh && ./configure --with-libvisio && make && sudo make install

Пуристы могут поругаться на аргумент --prefix=/usr и на make install вместо make checkinstall. Лично меня всё устраивает.

Конвертирование VSD в XHTML и SVG

Как уже было упомянуто чуть выше, в состав пакета libvisio входит утилита vsd2xhtml, которая конвертирует VSD в SVG и вставляет их в документы XHTML. Вот схема сети, сконвертированной и открытой в Inkscape:

An excerpt from an VSD file converted to XHTML and opened with Inkscape

Если Inkscape вам всяко милее LibreOffice Draw, редакция линуксграфикса не без извращённого удовольствия делится с вами описанием ритуальных плясок.

  1. Выполните команду ‘$ vsd2xhtml file.vsd > file.xhtml‘.
  2. Откройте file.xhtml в текстовом редакторе, удалите куски XHTML и оставьте куски SVG (см. ниже).
  3. Сохраните результат в SVG.
  4. Откройте SVG в Inkscape.
  5. Любуйтесь результатом.

Куски SVG начинаются этим:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg:svg version="1.1" xmlns:svg="http://www.w3.org/2000/svg" 
xmlns:xlink="http://www.w3.org/1999/xlink" width="1008" height="1008" >

…и предсказуемо заканчиваются этим:

</svg:svg>

Объявление XML и DOCTYPE по умолчанию закомментированы — это придётся исправить. Помните, что если в VSD несколько страниц, vsd2xhtml встроит в XHTML один за другим несколько документов SVG. Просто сохраните их в раздельные файлы.

Редакция линуксграфикса имеет смелость надеяться, что рано или поздно в Inkscape появится импортировщик VSD. А до тех пор ритуальные священнодействия разнообразят вашу жизнь и доставят немало искренней радости вашим близким.

В заключение

Соглашусь с Фридрихом: долой ложную скромность. Работа проделана действительно немалая. Возможности VSD охвачены не на 100% и скорее всего не будут когда-либо полностью охвачены. Тем не менее, об очевидных ошибках всегда стоит писать в трекер, прикрепляя к отчётам проблемные файлы. О них позаботятся.

Оставьте первый комментарий

Оставить комментарий

Ваш электронный адрес не будет опубликован.


*


Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.