
Для кого это руководство
В своё время для создания расширения к LibreOffice (LO) мне пришлось перелопатить кучу форумов и документации. Информации много, но она разбросана про крупицам. А когда если не знаешь, с какой стороны подступиться, на завершение проекта может уйти много времени.
В этой статье мы соберём и запустим минимально возможное расширение c условно полезной нагрузкой. Всё, что оно будет делать — выделять весь текст в окне редактора при нажатии на единственный пункт созданного нами меню.
Надеюсь, cозданный в статье шаблон поможет снизить порог входа и сэкономить время тем, кто захочет добавить свой функционал в бесплатный офисный пакет. Я сосредоточусь на практике, объясняя технические детали лишь там, где это необходимо.
В итоге у нас должно получиться вот такое меню:

Что такое расширение
Расширения для офисного пакета LibreOffice — это плагины, расширяющие базовый функционал. Можно создавать и добавлять собственные плагины для любого приложения в офисном пакете: Writer, Calc, Impress (аналоги Word, Excel, PowerPoint) и других. Если вам приходилось писать макросы для этих программ, то расширение можно считать оболочкой для их хранения, передачи и исполнения.
Сам файл расширения — это обычный zip-архив с изменённым расширением .oxt. Вы буквально можете создать zip-файл любой программой и вручную поменять расширение.
Из чего состоит
Так как мы собираем самое маленькое, но жизнеспособное расширение, внутри будет только два XML-файла и одна папка.
Habr_Menu_Extension.oxt
├───META-INF
│ └───manifest.xml
└───habr_menu.xcu
Рассмотрим их по порядку.
Папка META-INF должна быть всегда. Её название изменять нельзя, так как внутри находится файл manifest.xml, из которого LO узнает, из чего состоит расширение и как с ним взаимодей��твовать.
В нашем случае manifest.xml будет очень простым:
<?xml version="1.0" encoding="UTF-8"?>
<manifest:manifest xmlns:manifest="<http://openoffice.org/2001/manifest>">
<manifest:file-entry manifest:media-type="application/vnd.sun.star.configuration-data" manifest:full-path="habr_menu.xcu"/>
</manifest:manifest>
Здесь мы перечисляем доступные файлы, указывая их назначение (тип). В нашем одноклеточном расширении такой файл всего один — habr_menu.xcu.
Файл habr_menu.xcu описывает структуру нашего меню: как называется, какие пункты содержит и какие команды запускает.
<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data
xmlns:oor="<http://openoffice.org/2001/registry>"
xmlns:xs="<http://www.w3.org/2001/XMLSchema>" oor:name="Addons" oor:package="org.openoffice.Office">
<node oor:name="AddonUI">
<node oor:name="OfficeMenuBar">
<node oor:name="org.torrua.habr_menu" oor:op="replace">
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Habr</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<node oor:name="Submenu">
<node oor:name="N001" oor:op="replace">
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Say Hello!</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>.uno:SelectAll</value>
</prop>
</node>
</node>
</node>
</node>
</node>
</oor:component-data>
Если вы умеете читать XML-разметку, разобраться в содержимом будет несложно. Здесь мы иерархически добавляем в Addons некий элемент интерфейса — AddonUI. В нашем случае это элемент типа OfficeMenuBar — то есть главного меню программы.
Атрибут name вложенного элемента (ноды) содержит идентификатор нашего расширения. Он должен быть уникальным, так как по нему LO будет отличить наше меню от чужого, даже если у них будут одинаковые названия. Я выбрал "org.torrua.habr_menu", но можно использовать любой текст.
Далее указываем свойства меню:
Title(заголовок меню в интерфейсе) — напишем"Habr"Target(где оно должно открываться) — в нашем случае это_self, то есть в том же окне.
В ноде Submenu мы перечисляем подпункты меню, у каждого из которых должен быть порядковый номер, определяющий их очерёдность. Номер может начинаться с текста, но заканчиваться должен цифрами, например "N001".
Каждого подпункту необходимо прописать следующие свойства:
Title(заголовок пункта в интерфейсе) —"Say Hello"Target— тоже укажем_selfContext(контекст) — это свойство указывает, в каком из приложений офисного пакета будет отображаться этот элемент. Мы укажем"com.sun.star.text.TextDocument", чтобы кнопка появлялась в текстовом редакторе Writer. Это значит, что мы не увидим её, когда откроем Calc или Impress. Но если необходимо, можно указать несколько приложений через запятую.URL— это свойство определяет, какое действие будет выполнено при нажатии. Укажем".uno:SelectAll"— стандартную команду для выделения всего содержимого активного окна.
Собираем
Теперь собираем созданные файлы в zip-архив и меняем его расширение на oxt.

Устанавливаем
Чтобы установить расширение, нужно просто запустить созданный файл. Конечно, до этого у вас уже должен быть установлен сам LO. Появится окно подтверждения установки:

Нажимаем ОК и наше расширение появляется в общем списке:

Обратите внимание, что расширение названо именем файла. Это произошло потому, что мы не добавили в корень расширения файл description.xml, где обычно содержится информация о названии, версии и издателе расширения.
Нам осталось только перезапустить программу и проверить работу нашего меню!
Скачать готовое расширение и потрогать файлы самому можно в моем репозитории на GitHub: Release 0.0.1 ? Статья на Хабре · torrua/habr_menu_oxt (github.com)
