前の関連記事:LibreOffice5(4)unoinsp.pyの修正
LibreOffice(59)htmlファイルにSDKへのリンクをつけるでLibreOffice4でやったときはSDKのAPIの解説のhtmlファイル名がAPI名と全く関係ないものだったので一旦htmlの中身を読み込んでファイル名と対応させる辞書の作成が必要でした。LibreOffice5ではAPI名からAPIリファレンスのファイル名が作成できるのでもっと簡単にリンクをつけられそうです。
APIとAPIリファレンスの名前の対応を調べる
LibreOffice: Main PageにあるリファレンスページとlinuxBean14.04(83)LibreOfiice5.0.2のインストールでローカルでインストールしたリファレンスページのhtmlファイル名は同一のようです。
接頭辞がhttp://api.libreoffice.org/docs/idl/ref/かfile:///opt/libreoffice5.0/sdk/docs/idl/ref/かの違いだけです。(Windowsの場合は確認です。)
サービスのファイル名
com.sun.star.frame.Controller
↓
servicecom_1_1sun_1_1star_1_1frame_1_1Controller.html
インターフェイスのファイル名
com.sun.star.frame.XController
↓
interfacecom_1_1sun_1_1star_1_1frame_1_1XController.html
例外のファイル名
com.sun.star.lang.WrappedTargetException
↓
exceptioncom_1_1sun_1_1star_1_1lang_1_1WrappedTargetException.html
Structのファイル名
com.sun.star.awt.Rectangle
↓
structcom_1_1sun_1_1star_1_1awt_1_1Rectangle.html
enumについてはenumの名前からhtmlは作れませんでした。
LibreOffice(60)列挙型enumのリンクの辞書を生成するのときと同様に/opt/libreoffice5.0/sdk/docs/idl/ref/searchにあるenum_6c.jsからenums_78.jsとenumvalues_6a.jsからenmumvalues_79.jsに各enumの解説へのリンクがあるようですが、またそのうち必要に迫られたらやろうと思います。
とりあえずサービス名とインターフェイス名、例外名、Struct名のみのリンクをつけることにします。
UNOオブジェクトの属性をAPIリファレンスへのリンクを付けて出力する方法
unoinsp.py
試行錯誤の経過を書くゆとりもないほど試行錯誤して完成しました。
LibreOffice(55)WSGIでブラウザに結果を出力するとLibreOffice(59)htmlファイルにSDKへのリンクをつけるを応用しています。
単純にリンクをつけずにテキストで出力する方法、IPython Notebookの出力セルにHTMLで出力する方法、ウェブブラウザを起動して新しいタブにHTMLを出力する方法、の3つのメソッドを用意しました。
関数make_tree()でスタックをループさせている部分はもうあまり読みたくないのでそこはいじらずに済むようにprint()の部分に関数を値にもつ辞書で関数をねじ込んでメソッドの使い分けをしました。
意外に手間取ったのはHTMLタグを有効にしてIPython NotebookのOutセルに出力する方法です。
これについて別の記事に書きます。
まずはunoinsp.pyの使い方の説明をします。
tree()で単純にリンクをつけずにテキストで出力する
これはLibreOffice5(4)unoinsp.pyの修正と全く同じ結果になります。
使い方はLibreOffice5(3)IPython NotebookでUNOオブジェクトの属性を木で出力すると同じです。
LibreOffice5のXSCRIPTCONTEXTを入手できる状態でunoinsp.ObjInsp()をXSCRIPTCONTEXTを引数にしてインスタンス化します。
あとはそのインスタンスのメソッドtree()の引数に属性をみたいUNOオブジェクトを指定するとprint()で出力されます。
PyCharmやIPython Notebookで実行するとそれぞれの出力に木が出力されます。
LibreOfficeのマクロから実行してもprint()の出力先がないので何も出力されません。
itree()でIPython Notebookの出力セルにHTMLで出力する
この方法はIPython Notebook専用になります。
tree()メソッドの代わりにitree()メソッドを使います。
linuxBean14.04(88)LibreOffice5をIPython Notebookから操作するのいずれかの方法でXSCRIPTCONTEXTを得ます。
今回はソケット通信の状態で起動したLibreOffice5からXSCRIPTCONTEXTを得ました。
In [1]:
import unopy
XSCRIPTCONTEXT = unopy.connect()
if not XSCRIPTCONTEXT:
print("Failed to connect.")
import sys
sys.exit(0)
unoinspをインポートしてObjInspをXSCRIPTCONTEXTでインスタンス化します。
In [2]:
import unoinsp
ins = unoinsp.ObjInsp(XSCRIPTCONTEXT)
Writerのドキュメントを出力すると膨大になるのでそのコントローラの属性を出力します。
In [3]:
doc = XSCRIPTCONTEXT.getDocument()
controller = doc.getCurrentController()
UNOオブジェクトを引数にしてins.itree()を実行するとOutセルにLibreOffice: Main Pageへのリンクがついた木が出力されます。
SDKがインストールしてあってins.itree(controller, False)というように2番めの引数にFalseを指定するとローカルのSDKにあるIDLリファレンスへのリンクがつきます。
In [4]:
ins.itree(controller)
LibreOffice5(3)IPython NotebookでUNOオブジェクトの属性を木で出力するのテキスト出力のときと違ってHTMLで出力するとちゃんと横スクロールででますね。(linuxBean14.04のChromeで確認。)
このブログに貼り付けたものでは横幅が制限されているので横スクロールがでないChromeでは正しく見えずFirefoxでみる必要があります、、、と思ったのですがFirefoxでも横スクロールバーがでないのでちゃんと見えないです。
外部リンクアイコンが表示されるのもこのブログ上だけですので、IPython Notebook上では出力されません。
wtree()でウェブブラウザにHTMLを出力する
上記でitree()の代わりにwtree()を使うとPythonマイマクロフォルダにあるpyファイルと同じフォルダにworkfile.htmlファイルが作成されそのファイルがデフォルトのウェブブラウザの新しいタブに表示されます。
workfile.html
htmlファイルを見れる適当なサイトが確保できなかったのでGoogleサイトにアップしました。
ダウンロードをクリックしてウェブブラウザで開くと木が見れます。
この方法はIPython NotebookだけでなくPyCharmからや、さらにはLibreOffice5のマクロからも実行できます。
汎用性のある方法ですが結果が表示されるまで時間がかかるのが欠点です。
デフォルトのウェブブラウザを立ち上げた状態でマクロから実行する方法は比較的速く表示されます。
オフラインへのリンクにするオプションはitree()と同じです。
あとはenumのリンクも貼れれば完璧になりますのに、、、
LibreOffice(60)列挙型enumのリンクの辞書を生成するで変換辞書を作成すればよいのですがLibreOfficeがバージョンアップするとリファレンスへのリンクが代わって使えなくなるかもしれないのでもう少し様子をみることにします。
参考にしたサイト
リンクの下線を消す方法 - ホームページの作り方 - MB-Support パソコン初心者のサポートページ
下線があるとIDL名と主従関係がわかりにくいので表示させないようにしました。
HTMLタグにstyle属性の指定方法 style=
CSSでは細かい設定がやりにくいのでアンカータグを出力するときに直接styleを指定しました。
0 件のコメント:
コメントを投稿