LibreOffice5(5)unoinsp.pyでAPIリファレンスへのリンクを付ける

2015-11-07

旧ブログ

t f B! P L

前の関連記事: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)

.text.TextDocumentView
│   boolean  IsConstantSpellcheck
│   boolean  IsHideSpellMarks
│      long  LineCount
│      long  PageCount
├─.beans.XPropertySet
│                            void  addPropertyChangeListener( [in]                         string aPropertyName,
│                                                             [in] .beans.XPropertyChangeListener xListener
│                                                  ) raises ( .lang.WrappedTargetException,
│                                                             .beans.UnknownPropertyException)
│                            void  addVetoableChangeListener( [in]                         string PropertyName,
│                                                             [in] .beans.XVetoableChangeListener aListener
│                                                  ) raises ( .lang.WrappedTargetException,
│                                                             .beans.UnknownPropertyException)
│         .beans.XPropertySetInfo  getPropertySetInfo()
│                             any  getPropertyValue( [in] string PropertyName
│                                         ) raises ( .lang.WrappedTargetException,
│                                                    .beans.UnknownPropertyException)
│                            void  removePropertyChangeListener( [in]                         string aPropertyName,
│                                                                [in] .beans.XPropertyChangeListener aListener
│                                                     ) raises ( .lang.WrappedTargetException,
│                                                                .beans.UnknownPropertyException)
│                            void  removeVetoableChangeListener( [in]                         string PropertyName,
│                                                                [in] .beans.XVetoableChangeListener aListener
│                                                     ) raises ( .lang.WrappedTargetException,
│                                                                .beans.UnknownPropertyException)
│                            void  setPropertyValue( [in] string aPropertyName,
│                                                    [in]    any aValue
│                                         ) raises ( .lang.WrappedTargetException,
│                                                    .lang.IllegalArgumentException,
│                                                    .beans.PropertyVetoException,
│                                                    .beans.UnknownPropertyException)
├─.text.XTextViewCursorSupplier
│         .text.XTextViewCursor  getViewCursor()
├─.view.XViewSettingsSupplier
│         .beans.XPropertySet  getViewSettings()
└─.view.OfficeDocumentView
      ├─.view.XControlAccess
      │         .awt.XControl  getControl( [in] .awt.XControlModel xModel
      │                         ) raises ( .container.NoSuchElementException)
      └─.view.XSelectionSupplier
                     void  addSelectionChangeListener( [in] .view.XSelectionChangeListener xListener)
                      any  getSelection()
                     void  removeSelectionChangeListener( [in] .view.XSelectionChangeListener xListener)
                  boolean  select( [in] any xSelection
                        ) raises ( .lang.IllegalArgumentException)
.awt.XUserInputInterception
      void  addKeyHandler( [in] .awt.XKeyHandler xHandler)
      void  addMouseClickHandler( [in] .awt.XMouseClickHandler xHandler)
      void  removeKeyHandler( [in] .awt.XKeyHandler xHandler)
      void  removeMouseClickHandler( [in] .awt.XMouseClickHandler xHandler)
.datatransfer.XTransferableSupplier
      .datatransfer.XTransferable  getTransferable()
                             void  insertTransferable( [in] .datatransfer.XTransferable xTrans
                                            ) raises ( .datatransfer.UnsupportedFlavorException)
.frame.XController2
│             .awt.XWindow  ComponentWindow
│   [.beans.PropertyValue]  CreationArguments
│                   string  ViewControllerName
└─.frame.XController
      │            void  attachFrame( [in] .frame.XFrame Frame)
      │         boolean  attachModel( [in] .frame.XModel Model)
      │   .frame.XFrame  getFrame()
      │   .frame.XModel  getModel()
      │             any  getViewData()
      │            void  restoreViewData( [in] any Data)
      │         boolean  suspend( [in] boolean Suspend)
      └─.lang.XComponent
                  void  addEventListener( [in] .lang.XEventListener xListener)
                  void  dispose()
                  void  removeEventListener( [in] .lang.XEventListener aListener)
.frame.XControllerBorder
                     void  addBorderResizeListener( [in] .frame.XBorderResizeListener xListener)
      .frame.BorderWidths  getBorder()
           .awt.Rectangle  queryBorderedArea( [in] .awt.Rectangle aPreliminaryRectangle)
                     void  removeBorderResizeListener( [in] .frame.XBorderResizeListener xListener)
.frame.XDispatchInformationProvider
      [.frame.DispatchInformation]  getConfigurableDispatchInformation( [in] short CommandGroup)
                           [short]  getSupportedCommandGroups()
.frame.XDispatchProvider
        .frame.XDispatch  queryDispatch( [in] .util.URL URL,
                                         [in]    string TargetFrameName,
                                         [in]      long SearchFlags)
      [.frame.XDispatch]  queryDispatches( [in] [.frame.DispatchDescriptor] Requests)
.frame.XTitle
      string  getTitle()
        void  setTitle( [in] string sTitle)
.frame.XTitleChangeBroadcaster
      void  addTitleChangeListener( [in] .frame.XTitleChangeListener xListener)
      void  removeTitleChangeListener( [in] .frame.XTitleChangeListener xListener)
.lang.XInitialization
      void  initialize( [in] [any] aArguments
             ) raises ( .uno.Exception)
.lang.XServiceInfo
        string  getImplementationName()
      [string]  getSupportedServiceNames()
       boolean  supportsService( [in] string ServiceName)
.task.XStatusIndicatorSupplier
      .task.XStatusIndicator  getStatusIndicator()
.text.XRubySelection
      [.beans.PropertyValues]  getRubyList( [in] boolean Automatic)
                         void  setRubyList( [in] [.beans.PropertyValues] RubyList,
                                            [in]                 boolean Automatic)
.ui.XContextMenuInterception
      void  registerContextMenuInterceptor( [in] .ui.XContextMenuInterceptor Interceptor)
      void  releaseContextMenuInterceptor( [in] .ui.XContextMenuInterceptor Interceptor)
.view.XFormLayerAccess
      .form.runtime.XFormController  getFormController( [in] .form.XForm Form)
                            boolean  isFormDesignMode()
                               void  setFormDesignMode( [in] boolean DesignMode)
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を指定しました。

次の関連記事:LibreOffice5(6)既存インターフェイスを継承してPythonスクリプトをUNOコンポーネント化する例:その1

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ