LibreOffice5(3)IPython NotebookでUNOオブジェクトの属性を木で出力する

前の関連記事:LibreOffice5(2)コンテクストメニューをカスタマイズする例


LibreOffice(54)サービス属性、インターフェイス属性、メソッドも枝付きで出力であれこれやっていたものです。

unoinsp.pyを作る


(2015.11.3追記。この記事で作ったunoinsp.pyはサービスをサポートしているUNOオブジェクトが直接もっているインテーフェイスの出力漏れがあるのでLibreOffice5(4)unoinsp.pyの修正で修正しました。)

以前LibreOffice(60)列挙型enumのリンクの辞書を生成するまで作ってSDKのAPIの解説まで出力させようとしていたのですが、sdk/docs/idl/refのhtmlファイル名がLibreOfficeのバージョンによって変化していることに気がついてプロジェクトが途絶えた経緯があります。

LibreOffice(57)SDKからメソッドの解説を抽出するを作りなおせばなんとかなりそうですが、またやる気がでたらやることにします。

ということで解説付きは諦めて属性の名前のみの出力をします。

LibreOffice(54)サービス属性、インターフェイス属性、メソッドも枝付きで出力libreoffice54.pyを改変します。

このlibreoffice54.pyをモジュールとしてインポートしてobjinsp()関数を実行すればよいと思ったのですが、やってみたらXSCRIPTCONTEXTがないと言われます。

Python の名前空間とスコープを読んだところ「グローバルスコープ」といってもモジュールごとのスコープということを知りました、、、まあ当然のことなのですが、、、

ということでクラスにしてまずXSCRIPTCONTEXTを受け取ってインスタンス化するようにしました。

unoinsp.py

これを~/.config/libreoffice/4/user/Scripts/pythonに置きました。

UNOオブジェクトの例を得る

まずXSCRIPTCONTEXTを得ます。
In [1]:
import unopyboot
XSCRIPTCONTEXT = unopyboot.connect()
if not XSCRIPTCONTEXT:
    print("Failed to connect.")
    import sys
    sys.exit(0)
XSCRIPTCONTEXTからデスクトップを得て、そこから表示可能なコンポーネントであるオフィスコンポーネント、つまりオフィスドキュメントを得ます。

これが例にするUNOオブジェクトになります。
In [2]:
xDoc = XSCRIPTCONTEXT.getDesktop().loadComponentFromURL("private:factory/swriter", "_blank", 0, ())
Writerが起動します。

これでxDocにWriterのドキュメントオブジェクトが得られました。

UNOオブジェクトの属性一覧を得る方法

とりあえずprint()を使うとUNOオブジェクトの属性が出力されますがこれを読むのは結構しんどいです。
In [3]:
print(xDoc)
pyuno object (com.sun.star.lang.XComponent)0x84fe674{implementationName=SwXTextDocument, supportedServices={com.sun.star.document.OfficeDocument,com.sun.star.text.GenericTextDocument,com.sun.star.text.TextDocument}, supportedInterfaces={com.sun.star.container.XChild,com.sun.star.document.XDocumentPropertiesSupplier,com.sun.star.document.XCmisDocument,com.sun.star.rdf.XDocumentMetadataAccess,com.sun.star.document.XDocumentRecovery,com.sun.star.document.XUndoManagerSupplier,com.sun.star.document.XEventBroadcaster,com.sun.star.document.XDocumentEventBroadcaster,com.sun.star.lang.XEventListener,com.sun.star.document.XEventsSupplier,com.sun.star.document.XEmbeddedScripts,com.sun.star.document.XScriptInvocationContext,com.sun.star.frame.XModel2,com.sun.star.util.XModifiable2,com.sun.star.view.XPrintable,com.sun.star.view.XPrintJobBroadcaster,com.sun.star.frame.XStorable2,com.sun.star.frame.XLoadable,com.sun.star.script.XStarBasicAccess,com.sun.star.document.XViewDataSupplier,com.sun.star.util.XCloseable,com.sun.star.datatransfer.XTransferable,com.sun.star.document.XDocumentSubStorageSupplier,com.sun.star.document.XStorageBasedDocument,com.sun.star.script.provider.XScriptProviderSupplier,com.sun.star.ui.XUIConfigurationManagerSupplier,com.sun.star.embed.XVisualObject,com.sun.star.lang.XUnoTunnel,com.sun.star.frame.XModule,com.sun.star.frame.XTitle,com.sun.star.frame.XTitleChangeBroadcaster,com.sun.star.frame.XUntitledNumbers,com.sun.star.lang.XTypeProvider,com.sun.star.uno.XWeak,com.sun.star.text.XTextDocument,com.sun.star.text.XLineNumberingProperties,com.sun.star.text.XChapterNumberingSupplier,com.sun.star.text.XNumberingRulesSupplier,com.sun.star.text.XFootnotesSupplier,com.sun.star.text.XEndnotesSupplier,com.sun.star.util.XReplaceable,com.sun.star.text.XPagePrintable,com.sun.star.text.XReferenceMarksSupplier,com.sun.star.text.XTextTablesSupplier,com.sun.star.text.XTextFramesSupplier,com.sun.star.text.XBookmarksSupplier,com.sun.star.text.XTextSectionsSupplier,com.sun.star.text.XTextGraphicObjectsSupplier,com.sun.star.text.XTextEmbeddedObjectsSupplier,com.sun.star.text.XTextFieldsSupplier,com.sun.star.style.XStyleFamiliesSupplier,com.sun.star.style.XAutoStylesSupplier,com.sun.star.lang.XServiceInfo,com.sun.star.drawing.XDrawPageSupplier,com.sun.star.text.XDocumentIndexesSupplier,com.sun.star.beans.XPropertySet,com.sun.star.beans.XPropertyState,com.sun.star.document.XLinkTargetSupplier,com.sun.star.document.XRedlinesSupplier,com.sun.star.util.XRefreshable,com.sun.star.util.XLinkUpdate,com.sun.star.view.XRenderable,com.sun.star.xforms.XFormsSupplier,com.sun.star.text.XFlatParagraphIteratorProvider,com.sun.star.document.XDocumentLanguages,com.sun.star.util.XCloneable,com.sun.star.lang.XTypeProvider,com.sun.star.uno.XWeak,com.sun.star.util.XNumberFormatsSupplier,com.sun.star.lang.XUnoTunnel,com.sun.star.lang.XTypeProvider,com.sun.star.uno.XWeak,com.sun.star.uno.XAggregation,com.sun.star.lang.XMultiServiceFactory,com.sun.star.tiledrendering.XTiledRenderable}}
それがunoinsp.pyのObjInspクラスを使うと木にして出力してくれます。
In [4]:
import unoinsp
ins = unoinsp.ObjInsp(XSCRIPTCONTEXT)
ObjInspをXSCRIPTCONTEXTでインスタンス化します。

あとはins.tree()の引数にUNOオブジェクトを入れると属性一覧の木が出力されます。

横幅が足りないと折り返されてぐちゃぐちゃの木になってしまいます。

ブラウザウィンドウの幅を伸ばせばよいのですが、セルに横スクロールバーをつける方法はわかりませんでした。

とりあえずこのブログ上では横幅は固定しているのでどうがんばってもChromeで綺麗に見るのは不可能です。

Firefoxでは横スクロールバーが表示されて木として見えました。

ところがIPyhon Notebookの出力せるではFirefoxで見てもChromeと同様に横スクロールバーは出ずに折り返して表示されてしまいました。
In [5]:
ins.tree(xDoc)
.text.TextDocument
└─.text.GenericTextDocument
      │   .lang.Locale  CharLocale
      │           long  CharacterCount
      │         string  IndexAutoMarkFileURL
      │           long  ParagraphCount
      │        boolean  RecordChanges
      │          short  TwoDigitYear
      │           long  WordCount
      │         string  WordSeparator
      ├─.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)
      ├─.lang.XMultiServiceFactory
      │         .uno.XInterface  createInstance( [in] string aServiceSpecifier
      │                               ) raises ( .uno.Exception)
      │         .uno.XInterface  createInstanceWithArguments( [in] string ServiceSpecifier,
      │                                                       [in]  [any] Arguments
      │                                            ) raises ( .uno.Exception)
      │                [string]  getAvailableServiceNames()
      ├─.style.XStyleFamiliesSupplier
      │         .container.XNameAccess  getStyleFamilies()
      ├─.text.XBookmarksSupplier
      │         .container.XNameAccess  getBookmarks()
      ├─.text.XChapterNumberingSupplier
      │         .container.XIndexReplace  getChapterNumberingRules()
      ├─.text.XDocumentIndexesSupplier
      │         .container.XIndexAccess  getDocumentIndexes()
      ├─.text.XEndnotesSupplier
      │             .beans.XPropertySet  getEndnoteSettings()
      │         .container.XIndexAccess  getEndnotes()
      ├─.text.XFootnotesSupplier
      │             .beans.XPropertySet  getFootnoteSettings()
      │         .container.XIndexAccess  getFootnotes()
      ├─.text.XPagePrintable
      │         [.beans.PropertyValue]  getPagePrintSettings()
      │                           void  printPages( [in] [.beans.PropertyValue] xOptions
      │                                  ) raises ( .lang.IllegalArgumentException)
      │                           void  setPagePrintSettings( [in] [.beans.PropertyValue] aSettings)
      ├─.text.XReferenceMarksSupplier
      │         .container.XNameAccess  getReferenceMarks()
      ├─.text.XTextDocument
      │   │   .text.XText  getText()
      │   │          void  reformat()
      │   └─.frame.XModel
      │         │                  boolean  attachResource( [in]                 string URL,
      │         │                                           [in] [.beans.PropertyValue] Arguments)
      │         │                     void  connectController( [in] .frame.XController Controller)
      │         │                     void  disconnectController( [in] .frame.XController Controller)
      │         │   [.beans.PropertyValue]  getArgs()
      │         │       .frame.XController  getCurrentController()
      │         │          .uno.XInterface  getCurrentSelection()
      │         │                   string  getURL()
      │         │                  boolean  hasControllersLocked()
      │         │                     void  lockControllers()
      │         │                     void  setCurrentController( [in] .frame.XController Controller
      │         │                                      ) raises ( .container.NoSuchElementException)
      │         │                     void  unlockControllers()
      │         └─.lang.XComponent
      │                     void  addEventListener( [in] .lang.XEventListener xListener)
      │                     void  dispose()
      │                     void  removeEventListener( [in] .lang.XEventListener aListener)
      ├─.text.XTextEmbeddedObjectsSupplier
      │         .container.XNameAccess  getEmbeddedObjects()
      ├─.text.XTextFieldsSupplier
      │                .container.XNameAccess  getTextFieldMasters()
      │         .container.XEnumerationAccess  getTextFields()
      ├─.text.XTextFramesSupplier
      │         .container.XNameAccess  getTextFrames()
      ├─.text.XTextGraphicObjectsSupplier
      │         .container.XNameAccess  getGraphicObjects()
      ├─.text.XTextSectionsSupplier
      │         .container.XNameAccess  getTextSections()
      ├─.text.XTextTablesSupplier
      │         .container.XNameAccess  getTextTables()
      ├─.tiledrendering.XTiledRenderable
      │         void  paintTile( [in]  any Parent,
      │                          [in] long nOutputWidth,
      │                          [in] long nOutputHeight,
      │                          [in] long nTilePosX,
      │                          [in] long nTilePosY,
      │                          [in] long nTileWidth,
      │                          [in] long nTileHeight)
      ├─.util.XNumberFormatsSupplier
      │          .beans.XPropertySet  getNumberFormatSettings()
      │         .util.XNumberFormats  getNumberFormats()
      ├─.util.XRefreshable
      │         void  addRefreshListener( [in] .util.XRefreshListener l)
      │         void  refresh()
      │         void  removeRefreshListener( [in] .util.XRefreshListener l)
      ├─.util.XReplaceable
      │         .util.XReplaceDescriptor  createReplaceDescriptor()
      │                             long  replaceAll( [in] .util.XSearchDescriptor xDesc)
      ├─.util.XSearchable
      │         .util.XSearchDescriptor  createSearchDescriptor()
      │         .container.XIndexAccess  findAll( [in] .util.XSearchDescriptor xDesc)
      │                 .uno.XInterface  findFirst( [in] .util.XSearchDescriptor xDesc)
      │                 .uno.XInterface  findNext( [in]         .uno.XInterface xStartAt,
      │                                            [in] .util.XSearchDescriptor xDesc)
      └─.document.OfficeDocument
            │                  boolean  ApplyFormDesignMode
            │                  boolean  AutomaticControlFocus
            │   [.beans.PropertyValue]  InteropGrabBag
            │                   string  RuntimeUID
            ├─.document.XDocumentEventBroadcaster
            │         void  addDocumentEventListener( [in] .document.XDocumentEventListener Listener)
            │         void  notifyDocumentEvent( [in]              string EventName,
            │                                    [in] .frame.XController2 ViewController,
            │                                    [in]                 any Supplement
            │                         ) raises ( .lang.NoSupportException,
            │                                    .lang.IllegalArgumentException)
            │         void  removeDocumentEventListener( [in] .document.XDocumentEventListener Listener)
            ├─.document.XDocumentPropertiesSupplier
            │         .document.XDocumentProperties  getDocumentProperties()
            ├─.document.XEmbeddedScripts
            │                                       boolean  AllowMacroExecution
            │         .script.XStorageBasedLibraryContainer  BasicLibraries
            │         .script.XStorageBasedLibraryContainer  DialogLibraries
            ├─.document.XEventBroadcaster
            │         void  addEventListener( [in] .document.XEventListener Listener)
            │         void  removeEventListener( [in] .document.XEventListener Listener)
            ├─.document.XEventsSupplier
            │         .container.XNameReplace  getEvents()
            ├─.document.XUndoManagerSupplier
            │         .document.XUndoManager  getUndoManager()
            ├─.document.XViewDataSupplier
            │         .container.XIndexAccess  getViewData()
            │                            void  setViewData( [in] .container.XIndexAccess Data)
            ├─.frame.XStorable
            │          string  getLocation()
            │         boolean  hasLocation()
            │         boolean  isReadonly()
            │            void  store()
            │            void  storeAsURL( [in]                 string sURL,
            │                              [in] [.beans.PropertyValue] lArguments
            │                   ) raises ( .io.IOException)
            │            void  storeToURL( [in]                 string sURL,
            │                              [in] [.beans.PropertyValue] lArguments
            │                   ) raises ( .io.IOException)
            ├─.util.XModifiable
            │   │   boolean  isModified()
            │   │      void  setModified( [in] boolean bModified
            │   │              ) raises ( .beans.PropertyVetoException)
            │   └─.util.XModifyBroadcaster
            │               void  addModifyListener( [in] .util.XModifyListener aListener)
            │               void  removeModifyListener( [in] .util.XModifyListener aListener)
            ├─.view.XPrintJobBroadcaster
            │         void  addPrintJobListener( [in] .view.XPrintJobListener xListener)
            │         void  removePrintJobListener( [in] .view.XPrintJobListener xListener)
            └─.view.XPrintable
                        [.beans.PropertyValue]  getPrinter()
                                          void  print( [in] [.beans.PropertyValue] xOptions
                                            ) raises ( .lang.IllegalArgumentException)
                                          void  setPrinter( [in] [.beans.PropertyValue] aPrinter
                                                 ) raises ( .lang.IllegalArgumentException)

参考にしたサイト


Python の名前空間とスコープ
Pythonにはモジュールのグローバルスコープと関数のローカルスコープの2種類しかスコープはありません。

次の関連記事:LibreOffice5(4)unoinsp.pyの修正

PR

0 件のコメント:

コメントを投稿