понедельник, 11 мая 2015 г.

Просмотр составных документов .odc (Oberon/F) в Linux

Файлы .ODC, представляющие из себя составные документы, являются родным форматом файлов для программы Blackbox (Component Builder). Такие документы могут содержать как обогащённый текст (rich text), так и различные объекты, будь то изображение, элемент для сворачивания блоков кода, линейки для выравнивания объектов (табуляции), ресурсы для отображения форм, OLE-объекты или любые другие отображаемые объекты.
Упрощённо можно провести аналогию со страницей HTML со множеством Java-апплетов.


В основу среды разработки Blackbox заложена возможность редактирования составных документов ODC. Для того, чтобы показать содержимое документа из файлового менеджера, потребуется запустить ассоциированное с ним приложение, а именно blackbox.exe (не без помощи wine). При этом Blackbox загрузит программный каркас со всеми необходимыми компонентами для работы. Это не очень удобно и эффективно, особенно по той причине, что программа запускается при помощи программной прослойки wine.

Как-то случайно наткнувшись на утилиту odcread я подумал: а почему бы не использовать её для отображения файлов ODC в Linux как в терминале, так и в программе с GUI?

Для этого скомпилируем программу и самостоятельно установим (скопируем) исполняемый файл odcread в директорию /usr/local/bin (при помощи sudo).

Просмотр в программе Midnight Commander (mc)

Открываем в текстовом редакторе файл ~/.config/mc/mc.ext и добавляем туда следующие строки:
# .odc
regex/\.odc$
    View=%view{ascii} /usr/local/bin/odcread %f
Вуаля! Теперь у нас есть возможность просматривать файлы ODC и в mc (в режиме parsing - F8).


На этом можно остановиться, но я хотел получить возможность просмотра файлов прямиком из файлового менеджера Nautilus (GNOME).

Для того, чтобы просмотреть содержимое документов в файловом менеджере, нужно было каким-то образом отобразить. И я решил воспользоваться принципом конвейерной обработки данных, взяв stdout программы odcread за входные данные (stdin). Так я написал GTK+ просмотрщик текстовых файлов gpipeview.

Просмотр текстовых данных в gpipeview

Простенькая программа gpipeview на C с использованием библиотеки GTK+ получает поток данных через stdin и выводит содержимое в окне. Поддерживается буфер обмена, так что текст/код легко скопировать в другую программу.

Код программы находится по адресу https://gist.github.com/romiras/b89b9dc371c998402bd5
Компилируется так:
gcc -o gpipeview gpipeview.c  -Wall `pkg-config --libs --cflags gtk+-2.0`
Перед компиляцией следует установить все библиотеки GTK+, необходимые для компиляции. Просмотреть их список можно лишь запустив
pkg-config --libs --cflags gtk+-2.0

Скомпилировав программу, скопируем её в директорию /usr/local/bin , затем создадим такой Shell-скрипт для запуска из командной строки (назовём его odcview):
#!/bin/sh

VIEWER=/usr/local/bin/gpipeview

if [ -n "$1" ];then
    odcread $1 | $VIEWER &
else
  echo "First argument must be path to Oberon/F .ODC file."
  exit 2
fi
Таким образом, мы получаем возможность просмотра документов в графическом виде из командной строки:

odcview StdDialog.odc

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

Регистрация просмотрщика odcview в системе

Воспользуемся пакетом xdg-utils.

Для регистрации нового MIME типа создадим в текстовом редакторе файл x-oberon-f.xml
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
    <mime-type type="application/x-oberon-f">
        <comment xml:lang="en">Oberon/F compound document</comment>
        <magic priority="50">
            <match type="string" value="CDOo" offset="0"/>
        </magic>
        <magic priority="30">
            <match type="string" value="Documents.StdDocument" offset="11"/>
        </magic>
        <glob pattern="*.odc"/>
        <icon name="BlackBox_doc.png"/>
    </mime-type>
</mime-info>
Затем, открыв терминал в той же директории, запустим команду
xdg-mime install x-oberon-f.xml
Теперь надо ассоциировать с этим MIME типом нашу пиктограмму
(взял с дистрибутива Blackbox, конечно)
таким образом:
xdg-icon-resource install --context mimetypes --size 32 BlackBox_doc.png
Далее, создаём в текстовом редакторе файл ~/.local/share/applications/odcview.desktop с таким содержанием:
[Desktop Entry]
Encoding=UTF-8
Type=Application
Categories=Development;

Name=odcview
Name[de]=odcview

Exec=/usr/local/bin/odcview %U
Terminal=false
Icon=BlackBox_doc.png

# Register additional MIME types here:
#MimeType=application/x-oberon-f


и регистрируем нашу программку в системе:
xdg-mime default odcview.desktop application/x-oberon-f
update-mime-database    ~/.local/share/mime
update-desktop-database ~/.local/share/applications
Проверяем что всё зарегистрировано как положено и тип распознаётся системой:
xdg-mime query filetype testfile.odc
Должен быть такой вывод:
application/x-oberon-f

Окончательно, открываем в Nautilus папку с файлами ODC. При выборе правой кнопкой любого документа должен появиться пункт
Open With odcview
Теперь любой ODC документ можно просмотреть в файловом менеджере Nautilus без необходимости запускать каркас BlackBox в wine.

Комментариев нет:

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