前の関連記事:LibreOffice5(91)コンポーネントデータノードをルートまでたどる
ディスパッチコマンドのラベルが定義されているコンポーネントデータノード一覧
registry_ja.xcdファイルをChromiumで開いて整形されるのを待ってから「.uno:」で検索すると2211個ヒットが見つかります。
「node oor:name=".uno:」で検索してみても2211個がヒットしました。
これらについて網羅的にラベルの取得をしようと思ったのですが、ルートノードのパスを網羅的に取得する方法がわかりませんでした。
なので、「.uno:」で検索しつつルートノードのパスを手動でリストアップしました。
<oor:component-data oor:name="ReportCommands" oor:package="org.openoffice.Office.UI"> <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="CalcCommands" oor:package="org.openoffice.Office.UI"> <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="MathCommands" oor:package="org.openoffice.Office.UI"> <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="GenericCommands" oor:package="org.openoffice.Office.UI"> <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="DrawImpressCommands" oor:package="org.openoffice.Office.UI"> <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="StartModuleCommands" oor:package="org.openoffice.Office.UI"> <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="ChartCommands" oor:package="org.openoffice.Office.UI"> <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="BasicIDECommands" oor:package="org.openoffice.Office.UI"> <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="DbuCommands" oor:package="org.openoffice.Office.UI"> <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="BibliographyCommands" oor:package="org.openoffice.Office.UI"> <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="WriterCommands" oor:package="org.openoffice.Office.UI">とりあえず11個見つけました。
パッケージ名はすべてoor:package="org.openoffice.Office.UI"になっています。
コンポーネント名このリストのものを使います。
全ディスパッチコマンドのラベルを取得するマクロ
#!/opt/libreoffice5.4/program/python # -*- coding: utf-8 -*- import unohelper # オートメーションには必須(必須なのはuno)。 from com.sun.star.uno import RuntimeException from com.sun.star.beans import PropertyValue from com.sun.star.sheet import CellFlags as cf # 定数 def macro(documentevent=None): # 引数はイベント駆動用。 doc = XSCRIPTCONTEXT.getDocument() if documentevent is None else documentevent.Source # ドキュメントのモデルを取得。 ctx = XSCRIPTCONTEXT.getComponentContext() # コンポーネントコンテクストの取得。 smgr = ctx.getServiceManager() # サービスマネージャーの取得。 configreader = createConfigReader(ctx, smgr) # 読み込み専用の関数を取得。 props = "Label", "ContextLabel", "PopupLabel" # 取得するプロパティのタプル。 compornents = "ReportCommands", "CalcCommands", "MathCommands", "GenericCommands", "DrawImpressCommands", \ "StartModuleCommands", "ChartCommands", "BasicIDECommands", "DbuCommands", "BibliographyCommands", "WriterCommands" subnodes = "Commands", "Popups" datarows = [] # 行のリストのリスト。タプルでも良いが、すべての要素のリストの要素数は一致させる必要がある。 setIndicator, endIndicator = createStatusIndicator(doc) c = 0 # カウンター。 setIndicator(c) for compornent in compornents: for subnode in subnodes: rootpath = "/org.openoffice.Office.UI.{}/UserInterface/{}".format(compornent, subnode) root = None try: root = configreader(rootpath) except RuntimeException: continue if root is not None: outputs = [] for childname in root.getElementNames(): # 子ノードの名前のタプルを取得。ノードオブジェクトの直接取得はできない模様。 node = root.getByName(childname) # ノードオブジェクトを取得。 propvalues = ["" if i is None else i for i in node.getPropertyValues(props)] # 設定されていないプロパティはNoneが入るので""に置換する。 datarow = [childname] datarow.extend(propvalues) outputs.append(datarow) if outputs: c += len(outputs) # カウンターを増やす。 setIndicator(c) outputs.sort(key=lambda r: r[0]) # ディスパッチコマンドでソートする。 outputs.append([""]*(len(props)+1)) # 最後に空行を入れる。 datarow = ["DispatchCommand"] # 先頭行のセルのリスト。 datarow.extend(props) # propsを先頭行に追加。 rootpathrow = [rootpath] rootpathrow.extend([""]*len(props)) datarows.extend((rootpathrow, datarow)) # 行のセルのリストのリスト。 datarows.extend(outputs) endIndicator() controller = doc.getCurrentController() # コントローラーを取得。 sheet = controller.getActiveSheet() # アクティブなシートを取得。 sheet.clearContents(cf.VALUE+cf.DATETIME+cf.STRING+cf.ANNOTATION+cf.FORMULA+cf.HARDATTR+cf.STYLES) # セルの内容を削除。cf.HARDATTR+cf.STYLESでセル結合も解除。 sheet[:len(datarows), :len(datarows[0])].setDataArray(datarows) # シートに結果を出力する。 cellcursor = sheet.createCursor() # シート全体のセルカーサーを取得。 cellcursor.gotoEndOfUsedArea(True) # 使用範囲の右下のセルまでにセルカーサーのセル範囲を変更する。 cellcursor.getColumns().setPropertyValue("OptimalWidth", True) # セルカーサーのセル範囲の列幅を最適化する。 sheet[0, 1].setString("Got {} Labels".format(c)) def createConfigReader(ctx, smgr): # ConfigurationProviderサービスのインスタンスを受け取る高階関数。 configurationprovider = smgr.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", ctx) # ConfigurationProviderの取得。 def configReader(path): # ConfigurationAccessサービスのインスタンスを返す関数。 node = PropertyValue(Name="nodepath", Value=path) return configurationprovider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", (node,)) return configReader def createStatusIndicator(doc): # プログレスバーの表示。 frame = doc.getCurrentController().getFrame() # ドキュメントのフレームを取得。 indicator = frame.createStatusIndicator() # フレームからステータスバーを取得する。 maxrange = 2254 # ステータスバーに表示するプログレスバーの目盛りの最大値。 indicator.start("Collecting labels for dispatch commands.", maxrange) # ステータスバーに表示する文字列とプログレスバーの目盛りを設定。 def setIndicator(c): indicator.setValue(c) # プレグレスバーの位置を設定。 def endIndicator(): indicator.end() # reset()の前にend()しておかないと元に戻らない。 indicator.reset() return setIndicator, endIndicator g_exportedScripts = macro, #マクロセレクターに限定表示させる関数をタプルで指定。ちょっと時間がかかるためステータスバーにプログレスバーを表示させるようにしました。
GetAllDispatchCommadLabels.ods
このマクロを埋め込んだCalcドキュメントです。
文書を開くとこのマクロが起動するようになっています。
https://docs.google.com/spreadsheets/d/e/2PACX-1vRxC0Ut-qE3mj3hHhOQ7vCF57FP06Epls-QEsgndSiAGPHse3V2HDsDVRqFbnL31UokRepb1cvZ3uqG/pubhtml?gid=591872511&single=true
linuxBeansでは2214個でてきました。
ディスパッチコマンドかどうかは確認していないので、2211個より少し増えています。
https://docs.google.com/spreadsheets/d/e/2PACX-1vRxC0Ut-qE3mj3hHhOQ7vCF57FP06Epls-QEsgndSiAGPHse3V2HDsDVRqFbnL31UokRepb1cvZ3uqG/pubhtml?gid=1167085010&single=true
Windows10では2204個でした。
ほぼ同じことが、Calcの「Xmlソース」機能でも出来ますね。
返信削除抽出数が微妙に少なかったけど。
日本語翻訳ボランティアのチャンネルで紹介されています。
てくてくLibreOffice Calc:「XMLデータを統計処理」
https://www.youtube.com/watch?v=6TXppu106Vk