LibreOffice5(74)PathSubstitutionサービスで既定値を取得する

2017-08-25

旧ブログ

t f B! P L
LibreOffice 5.3 SDK - Developer's Guide ExamplesにあるPathSubstitutionTest.javaをPythonにします。PathSubstitutionサービスでLibreOfficeの既定値を取得します。

前の関連記事:LibreOffice5(73)Javaの例:GUIをPythonにする その6


pathsubstitutiontest_macro.py: LibreOfficeの既定値を取得する


OfficeDev/pathsubstitutiontest_macro.py at 641cf48f2928145d4a785e1a0e587d3cb0bf44ac · p--q/OfficeDev
def macro():
 ctx = XSCRIPTCONTEXT.getComponentContext()  # コンポーネントコンテクストの取得。
 smgr = ctx.getServiceManager()  # サービスマネージャーの取得。
 doc = XSCRIPTCONTEXT.getDocument()
 if not doc.supportsService("com.sun.star.text.TextDocument"):  # Writerドキュメントに結果を出力するのでWriterドキュメントであることを確認する。
  raise RuntimeError("Please execute this macro with a Writer document.")  # Writerドキュメントでないときは終わる。
 txts = []  # Writerドキュメントに出力する文字列を入れるリスト。
 pathvals = "$(home)",\
    "$(inst)",\
    "$(instpath)",\
    "$(insturl)",\
    "$(prog)",\
    "$(progpath)",\
    "$(progurl)",\
    "$(temp)",\
    "$(user)",\
    "$(userpath)",\
    "$(userurl)",\
    "$(username)",\
    "$(work)",\
    "$(path)",\
    "$(lang)",\
    "$(langid)",\
    "$(vlang)"  # https://wiki.openoffice.org/wiki/Documentation/DevGuide/OfficeDev/Predefined_Variables
 pathsubstservice = smgr.createInstanceWithContext("com.sun.star.comp.framework.PathSubstitution", ctx)
 for pathval in pathvals:
  try:
   url = pathsubstservice.getSubstituteVariableValue(pathval)
  except NoSuchElementException:
   t = "{} is unknown variable!".format(pathval)
   print(t, file=sys.stderr)
   txts.append(t)
   continue  # ループの次の周期に飛ぶ。
  systempath = ";".join([os.path.normpath(unohelper.fileUrlToSystemPath(p)) if p.startswith("file://") else p for p in url.split(";")])  # 各パスについてシステムパスにして正規化する。
  t = "{} : {}".format(pathval, systempath)
  print(t) 
  txts.append(t)
 t = "These paths have been converted to system paths."
 print(t)
 txts.append(t)
 doc.getText().setString("\n".join(txts))  # Writerドキュメントに出力。 
 print("\nCheck the resubstitution function")  # 変数に置換する例。
 path = pathsubstservice.getSubstituteVariableValue(pathvals[0])
 path += "/test"
 print("Path = {}".format(path))
 resustpath = pathsubstservice.reSubstituteVariables(path)
 print("Resubstituted path = {}".format(resustpath))
g_exportedScripts = macro, #マクロセレクターに限定表示させる関数をタプルで指定。
getSubstituteVariableValue()メソッドで返ってくるのはFileURLなので34行目でそれをunohelper moduleの fileUrlToSystemPath()でシステムパスに変換してから出力しています。

Writerドキュメントからこのマクロを実行するとWriterドキュメントに次の出力が得られました。
$(home) : /home/pq
$(inst) : /opt/libreoffice5.2
$(instpath) : /opt/libreoffice5.2
$(insturl) : /opt/libreoffice5.2
$(prog) : /opt/libreoffice5.2/program
$(progpath) : /opt/libreoffice5.2/program
$(progurl) : /opt/libreoffice5.2/program
$(temp) : /tmp
$(user) : /home/pq/.config/libreoffice/4/user
$(userpath) : /home/pq/.config/libreoffice/4/user
$(userurl) : /home/pq/.config/libreoffice/4/user
$(username) : pq
$(work) : /home/pq
$(path) : /usr/local/sbin;/usr/local/bin;/usr/sbin;/usr/bin;/sbin;/bin;/usr/games;/usr/local/games
$(lang) is unknown variable!
$(langid) : 1041
$(vlang) : ja
These paths have been converted to system paths.
それぞれの値の解説はPredefined Variables - Apache OpenOffice Wikiにあります。

$(inst)、$(instpath)、$(insturl)
$(prog)、$(progpath)、$(progurl)
$(user)、$(userpath)、$(userurl)

これらの値は同じものです。

$(inst)、$(prog)、$(user)以外のものは後方互換性のために残っているものなので使うべきではないとデベロッパーガイドに書いてあります。

デベロッパーガイドにある$(lang)はLibreOffice: PathSubstitution Service Referenceにも載っておらず廃止されたようです。

$(home) ホームフォルダ
$(prog) LibreOfficeのprogramフォルダ
$(user) LibreOfficeのユーザーフォルダ

私が使いそうなのはこの3つです。

LibreOfficeの言語設定についてはLibreOffice5(64)オプションページを持つ拡張機能の例を作る: その2で使った/org.openoffice.Setup/L10NのooLocaleの値を読み込む方法で事足りそうです。

LibreOfficeのインストールパスの取得はLibreOffice5(12)PythonでLibreOfficeのバージョン番号を得る方法でもやりましたが、$(prog)を使う今回の方法が正攻法でしょう。
Check the resubstitution function
Path = file:///home/pq/test
Resubstituted path = $(work)/test
オートメーションで実行するとFileURLの一部をreSubstituteVariables()メソッドで既定値に置換する例の出力もされますが、使う機会はあるでしょうか、、、

Windows10 64bitでの既定値


pathsubstitutiontest_macro.pyはWindows10 64bitでもマクロとしては動きます。
$(home) : C:\Users\pq\Documents
$(inst) : C:\Program Files (x86)\LibreOffice 5
$(instpath) : C:\Program Files (x86)\LibreOffice 5
$(insturl) : C:\Program Files (x86)\LibreOffice 5
$(prog) : C:\Program Files (x86)\LibreOffice 5\program
$(progpath) : C:\Program Files (x86)\LibreOffice 5\program
$(progurl) : C:\Program Files (x86)\LibreOffice 5\program
$(temp) : C:\Users\pq\AppData\Local\Temp
$(user) : C:\Users\pq\AppData\Roaming\LibreOffice\4\user
$(userpath) : C:\Users\pq\AppData\Roaming\LibreOffice\4\user
$(userurl) : C:\Users\pq\AppData\Roaming\LibreOffice\4\user
$(username) : pq
$(work) : C:\Users\pq\Documents
$(path) : C:\Program Files (x86)\LibreOffice 5;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\QuickTime\QTSystem;C:\Users\pq\AppData\Local\Microsoft\WindowsApps
$(lang) is unknown variable!
$(langid) : 1041
$(vlang) : ja
These paths have been converted to system paths.
このような結果が取得できました。

linuxBeanと同等のものが返ってきています。

参考にしたサイト


LibreOffice 5.3 SDK - Developer's Guide Examples
Javaの例PathSubstitutionTest.javaをPythonにしました。

Predefined Variables - Apache OpenOffice Wiki
PathSubstitutionサービスで取得できる既定値の解説。

LibreOffice: PathSubstitution Service Reference
LibreOfficeのPathSubstitutionサービスの解説。

次の関連記事:LibreOffice5(75)thePathSettingsシングルトンで既定のパスを取得

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ