LibreOffice のサイドバーの作成が俺の理解を越えているので AI に作って貰う…ことにする

M365 の Copilot が絶賛不評中らしいのですが、まあ、MS-Office で Copilot を使う理由としたら Teams とかパワポ関係だと思うので、Word とか Excel ではいまひとつなんですよ。なのにあの高い値段をペイできるのだろうか? と個人的には思うのですが、企業としてはどうなんでしょう?

それはておき、LibreOffice でも Copilot のようにサイドバーを置いて AI にいろいろやって貰うといいんじゃないか?と思いつつも、外部から操作しかできないのかな、と思っていたところですが、実はできます。

mihailthebuilder/librethinker-extension: AI Copilot for LibreOffice Writer https://github.com/mihailthebuilder/librethinker-extension

NikolaiRadke/LibreAssist: Agentic Working with LibreOffice https://github.com/NikolaiRadke/LibreAssist

拡張機能は https://extensions.libreoffice.org/ でダウンロードができます。タイミングがよくて、LibreAssist なんて 1週間前に出来立てのほやほやです。まさしく、ホクホクですね。

ExcelLikeUno を作るのも AI からアクセスしやいう作りにすればいいのじゃないかという別な思惑があって、Copilot の Excel 版が難航していたのを見ていて、どうも MCP あたりでプロンプトの指示をうまくマクロに変換できればうまくできそう、っぽいことは考えていたのですが…まあ、考えていただけです。

ただ、あの Copilot のサイドバーっぽいものを LibreOffice に作るとなると「拡張機能」を作らねばならず、これがなかなか大変そうだったのです。

で、結論から言うと、大変です。サイドバーにテキストとボタンを配置するだけで一苦労でした。

実は先の librethinker-extension と LibreAssist は、unodit https://github.com/kelsa-pi/unodit というのをベースにしてサイドバーを表示しています。unodit は、もともと LibreOffice の Basic のダイアログを Python にコンバートするツールです。どうやら、LibreOffice のダイアログが GTK がベースになっているのですが、GTK の glade が吐き出す .ui の書き方とは異なるようなのです。よくわからないのですが、GTK がベースらしいのに、Python マクロ(UNO API?)から .ui が読み込めないのはどうかと思うのですが、従来型の .xdl は読み込めます。

glade の .ui 形式

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
  <requires lib="gtk+" version="3.24"/>
  <object class="GtkWindow">
    <property name="can-focus">False</property>
    <child>
      <object class="GtkBox" id="root">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkScrolledWindow">
            <property name="visible">True</property>
            <property name="can-focus">True</property>
            <property name="shadow-type">in</property>
            <child>
              <object class="GtkTextView" id="chat_log">
                <property name="visible">True</property>
                <property name="can-focus">True</property>
              </object>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>

LibreOffice の .xdl 形式

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd">
<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script"
 dlg:id="CopilotPanel" dlg:left="10" dlg:top="10" dlg:width="260" dlg:height="220"
 dlg:closeable="false" dlg:moveable="false" dlg:withtitlebar="false">
  <dlg:styles>
    <dlg:style dlg:style-id="readonly" dlg:multi-line="true" dlg:read-only="true" dlg:tab-stop="false" dlg:border="true"/>
  </dlg:styles>
  <dlg:control dlg:id="log" dlg:style-id="readonly" dlg:type="multi-line-edit" dlg:left="8" dlg:top="8" dlg:width="244" dlg:height="130"/>
  <dlg:control dlg:id="input" dlg:type="edit" dlg:left="8" dlg:top="150" dlg:width="244" dlg:height="12"/>
  <dlg:control dlg:id="send" dlg:type="pushbutton" dlg:left="8" dlg:top="170" dlg:width="60" dlg:height="14" dlg:value="Submit"/>
</dlg:window>

どっちがどうという訳でもないのですが、

  • .xdl 形式は LibreOffice のダイアログ編集でしか作れない
  • .ui 形式は Windows では MSYS2 の glade をインストールする必要がある

という難点があって、さらに言えば、UNO API では .ui 形式のロードがサポートされていません。これもなんだかよく分からないのですが、仕方がありません。

で、せっかく python を使っているのに Basic に引きずられるのも嫌なので、どうせならば SwiftUI や Jetpack Compose みたいな宣言的 UI を作れないかと思って模索している途中です。と言いますか、ひな形のサイドバーができるところまでを難航中です。

できることならば、このループに入りたいです。

## 目的

- LibreOffice の Sidebar を開発する環境を整える
- Sidebar コードのひな形
- Sidebar UI を SwiftUI 風の DSL で記述できる
- スタンドアローン環境で Sidebar UI をプレビューできる
- Sidebar UI を LibreOffice に組み込む

## 進め方

1. Sidebar の UI を SwiftUI 風にコーディング
2. スタンドアローンで動作確認(イベント処理などは無視) レイアウトの確認
3. Sidebar のコードに入れて動作確認
4. 再び、スタンドアローンでチェックが可能

ちなみにサウドバーを作るときには、以下の構造を理解しないといけません。

## フォルダ構成

├── sidebar/ # LibreOffice 拡張(.oxt)関連
│ ├── description.xml
│ ├── Addons.xcu
│ ├── Sidebar.xcu
│ ├── Factory.xcu
│ ├── pythonpath/
│ │ ├── __init__.py
│ │ ├── sidebar.py # Sidebar UI コントローラ
│ │ └── uno_entry.py # UNO エントリーポイント
│ │ └── ui_definitions/
│ │ └── chat_ui.py ← ビルド時に自動コピーされる
│ └── META-INF/
│ └── manifest.xml

なんか、なつかしの Java プロジェクトの構成ですね。この構成は暫くやっていない(20年ほどやっていない)ので、かなり新鮮です…が、いまさら、あれこと悩みたくはありません。

Sidebar.xcu とか、Factory.xcu とか、中身の繋がりがややこしい(間違えると動かない)ので、次回は忘備録的に残しておきます。できれば、ここはツール化して自動化しておきたい。

カテゴリー: 開発, LibreOffice パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*