前の関連記事: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オブジェクトになります。
これが例にするUNOオブジェクトになります。
In [2]:
xDoc = XSCRIPTCONTEXT.getDesktop().loadComponentFromURL("private:factory/swriter", "_blank", 0, ())
Writerが起動します。
これでxDocに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と同様に横スクロールバーは出ずに折り返して表示されてしまいました。
あとは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種類しかスコープはありません。

0 件のコメント:
コメントを投稿