LibreOffice5(30)xcsファイルとxcuファイルとxcdファイル:その1

ラベル: ,

前の関連記事:LibreOffice5(29)ダイアログエディタの言語ツールバーを利用する方法


LibreOffice5(12)PythonでLibreOfficeのバージョン番号を得る方法でxcdファイルがでてきてEasyDevとかMRIとかの拡張機能ではxcsファイルやxcuファイルを使っていてLibreOffice5(17)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その2ではxcuファイルのoor:op="replace"設定もでてきて、これらの書式についてちゃんと学習したいと思っていましたがようやくその解説をutil: OOo Registry Document Formatにみつけました。

xcsファイルで定義してxcuファイルで変更を加える


xcsファイルは設定項目の定義やそのデフォルト値の設定、繰り返し使う設定項目のためのテンプレートの定義など設定についての汎用的な定義をするものでRegistry Component Schema Formatで書かれています。

xcuファイルはxcsファイルで定義された項目について追加したり変更したり変更を加えるものでRegistry Update Formatで書かれています。

OOoBasic/Generic/Configurations - ...?を読むとOpenOfficeでは多数のxcsファイルとxcuファイルがあったようですが、LibreOfficeではデフォルト設定はxcsファイルとxcuファイルをまとめたxcdファイルに設定されています。(Performance/Configuration - Apache OpenOffice Wiki

/opt/libreoffice5.0/share/registry/main.xcdがデフォルト値をまとめたファイルになるのですが、大きいのでとても読みにくいです。

Chromiumで開くとノードごとにインデントしてくれますが整形し終わるまで結構時間がかかります。

デフォルト値からユーザーが変更した値は~/.config/libreoffice/4/user/registrymodifications.xcuファイルに保存されています。

これもたくさん項目が設定されています。

xcuファイルは同じ設定項目に対して複数存在できそれらは階層構造になっています。

Extensions/Configuration - ...?を参考にするとこれらのファイルを読み込まれる順番はまず/opt/libreoffice5.0/share/registryにあるxcdファイルが読み込まれ、次に/opt/libreoffice5.0/share/extensionsの拡張機能にあるファイルが読み込まれ、次に~/.config/libreoffice/4/user/extensionsにあるファイルが読み込まれ、最後に~/.config/libreoffice/4/user/registrymodifications.xcuファイルが読み込まれるだと思います。

あとに読み込まれるファイルの内容が優先になります。

(util: OOo Registry Document Formatに書いてある「layer」がこのフォルダの階層を指すのか、読み込まれるファイルを指すのか、コンポーネントスキーマノードやコンポーネントデータノードを指すのか私には判然としないのではっきりとしたことがわかりません。フォルダ階層があとになるほど優先になるとは思うのですが、同じフォルダ階層にあるファイルが読み込まれる順が一定なのかどうなのかよくわかりません。)

内容の融合の仕方はLayering and Mergingで解説されているOperationで決めることができます。

/opt/libreoffice5.0/share/registry/main.xcdの全体構造


とりあえずmain.xcdを読んでみます。
<oor:data xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oor="http://openoffice.org/2001/registry"><!-- 名前空間。oor:LibreOffice固有の名前空間。xsi:Update Formatでのみ使われる名前空間。-->
 <oor:component-schema oor:name="コンポートネント名" oor:package="パッケージ名" xml:lang="言語"><!-- Registry Component Schema Format -->
  <templates>
   <!-- テンプレート -->
  </templates>
  <component>
   <!-- コンポーネント -->
  </component>
 </oor:component-schema>
 <oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="コンポートネント名" oor:package="パッケージ名"><!-- Registry Update Format -->
  <!-- コンポーネントデータ -->
 </oor:component-data>
</oor:data>
大枠ではこんな形式になっていました。

oor:component-schemaタグ(コンポーネントスキーマノード)の部分はxcsファイルに該当する部分でoor:component-dataタグ(コンポーネントデータノード)がxcuファイルに該当する部分でこれらを合わせてxcdファイルになっています。

パッケージ名は"org.openoffice"と"org.openoffice.Office"、"org.openoffice.Office.UI"、"org.openoffice.TypeDetection"などが使われていました。

コンポーネント名とパッケージ名の組み合わせでoor:component-schemaタグとoor:component-dataタグが対応しており、main.xcdではoor:component-schemaタグが前半にまとめられoor:component-dataタグが後半にまとめられていました。

コンポーネントスキーマノードとコンポーネントデータノードの対応をみる


まずはmain.xcdの一番最初に出てくるコンポーネントスキーマノードを見てみます。
<oor:component-schema oor:name="FirstStartWizard" oor:package="org.openoffice" xml:lang="en-US"><!-- パッケージ名org.openoffice、コンポーネント名FirstStartWizard、言語en-US、のコンポーネントスキーマノード -->
 <templates><!-- テンプレートノード -->
  <group oor:name="Option"><!-- Optionグループノード -->
   <prop oor:name="Visible" oor:type="xs:boolean" oor:nillable="false"><!-- Visibleプロパティノード。データ型はxs:boolean、null値は不可。 -->
    <value>true</value><!-- デフォルト値をtrueに設定 -->
   </prop>
  </group>
 </templates>
 <component><!-- コンポーネントノード -->
  <group oor:name="TabPages"><!-- TabPagesグループノード -->
   <group oor:name="Registration"><!-- Registrationグループノード -->
    <set oor:name="RegistrationOptions" oor:node-type="Option"/><!-- RegistrationOptionsノードセット。テンプレートのOptionグループノード型を使用。 -->
   </group>
  </group>
 </component>
</oor:component-schema>
これに対応するパッケージ名org.openoffice、コンポーネント名FirstStartWizardのコンポーネントデータノードを探します。
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="FirstStartWizard" oor:package="org.openoffice"><!-- パッケージ名org.openoffice、コンポーネント名FirstStartWizard、言語en-US、のコンポーネントデータノード -->
 <node oor:name="TabPages"><!-- TabPagesノード -->
  <node oor:name="Registration"><!-- Registrationノード-->
   <node oor:name="RegistrationOptions"><!-- RegistrationOptionsノード。子ノードはすべてOptionグループノード型。 -->
    <node oor:name="NowButton" oor:op="replace"/>
    <node oor:name="LaterButton" oor:op="replace"/>
    <node oor:name="NeverButton" oor:op="replace"/>
    <node oor:name="AlreadyRegisteredButton" oor:op="replace"/>
   </node>
  </node>
 </node>
</oor:component-data>
コンポーネントデータノードの構成はコンポーネントスキーマノードのコンポーネントノードで定義されており、コンポーネントノードでグループノードとプロパティノードを定義し、それがコンポーネントデータノードのノードとプロパティに対応します。

しかしこのFirstStartWizardコンポーネントのコンポーネントノードではプロパティは使われずにセットノードが使われています。

セットノードはノードの集合を表し、コンポーネントデータノードで動的に子ノードを増減できます。

さらにデフォルト値も各子ノードに設定可能ですが、子ノードは同一のノード型である必要があります。

FirstStartWizardコンポーネントのコンポーネントデータノードのRegistrationOptionsノードの子ノードはコンポーネントスキーマノードのコンポーネントノードでOptionグループノード型に定義されています。

Optionグループノード型自体はコンポーネントスキーマノードのテンプレートノードで定義されています。

コンポーネントデータノードでOptionグループノード型を展開して書くと以下のようになります。
   <node oor:name="RegistrationOptions"><!-- RegistrationOptionsノード。 -->
    <node oor:name="NowButton" oor:op="replace">
     <prop oor:name="Visible" oor:type="xs:boolean" oor:nillable="false">
      <value>true</value>
     </prop>
    </node>
    <node oor:name="LaterButton" oor:op="replace">
     <prop oor:name="Visible" oor:type="xs:boolean" oor:nillable="false">
      <value>true</value>
     </prop>
    </node>
    <node oor:name="NeverButton" oor:op="replace">
     <prop oor:name="Visible" oor:type="xs:boolean" oor:nillable="false">
      <value>true</value>
     </prop>
    </node>
    <node oor:name="AlreadyRegisteredButton" oor:op="replace">
     <prop oor:name="Visible" oor:type="xs:boolean" oor:nillable="false">
      <value>true</value>
     </prop>
    </node>
   </node>

node-refノードとセットノードの違い


テンプレートノードの再利用方法としてセットノード以外にutil: OOo Registry Document FormatのRe-Use of Templatesにnode-refノードが解説されています。

セットノードの場合はノード型に指定した型を持つ子ノードがコンポーネントノードで作成されるのに対して、node-refノードは単純にテンプレートノードのグループノードの型のコピーが展開されるだけです。

org.openoffice.OfficeパッケージのDataAccessコンポーネントにはnode-refノードとセットノードが並んででてくるのでmain.xcdから関係する部分を抜き出してみてみます。

まずはコンポーネントスキーマノードの部分です。
<oor:component-schema oor:name="DataAccess" oor:package="org.openoffice.Office" xml:lang="en-US">
 <templates>
  <group oor:name="DataSource">
   <prop oor:name="DataSourceName" oor:type="xs:string"/>
   <prop oor:name="Command" oor:type="xs:string"/>
   <prop oor:name="CommandType" oor:type="xs:short"/>
   <set oor:name="Fields" oor:node-type="FieldAssignment"/>
  </group>
  <group oor:name="FieldAssignment">
   <prop oor:name="ProgrammaticFieldName" oor:type="xs:string"/>
   <prop oor:name="AssignedFieldName" oor:type="xs:string"/>
  </group>
 </templates>
 <component>
  <group oor:name="Bibliography">
   <node-ref oor:name="CurrentDataSource" oor:node-type="DataSource"/>
   <set oor:name="DataSourceHistory" oor:node-type="DataSource"/>
  </group>
 </component>
</oor:component-schema>
16行目がnode-refノード、17行目がセットノードになっています。

いずれもノード型はDataSourceになっており、DataSourceはテンプレートノードで定義されています。

DataSourceノード自体にもセットノードが含まれておりそのノード型であるFieldAssignmentもテンプレートノードで定義されています。

これに対応するパッケージ名org.openoffice.Office、コンポーネント名DataAccessのコンポーネントデータノードを探します。

長いので説明に関係ない部分は省略しました。
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="DataAccess" oor:package="org.openoffice.Office">
 <node oor:name="Bibliography">
  <node oor:name="CurrentDataSource">
   <prop oor:name="DataSourceName">
    <value>Bibliography</value>
   </prop>
   <prop oor:name="Command">
    <value>biblio</value>
   </prop>
   <prop oor:name="CommandType">
    <value>0</value>
   </prop>
  </node>
  <node oor:name="DataSourceHistory">
   <node oor:name="Default" oor:op="replace">
    <prop oor:name="DataSourceName">
     <value>Bibliography</value>
    </prop>
    <prop oor:name="Command">
     <value>biblio</value>
    </prop>
    <prop oor:name="CommandType">
     <value>0</value>
    </prop>
    <node oor:name="Fields">
     <node oor:name="ShortName" oor:op="replace">
      <prop oor:name="ProgrammaticFieldName">
       <value>Identifier</value>
      </prop>
      <prop oor:name="AssignedFieldName">
       <value>Identifier</value>
      </prop>
     </node>
     <node oor:name="Type" oor:op="replace">
      <prop oor:name="ProgrammaticFieldName">
       <value>BibliographyType</value>
      </prop>
      <prop oor:name="AssignedFieldName">
       <value>Type</value>
      </prop>
     </node>
    </node>
   </node>
  </node>
 </node>
</oor:component-data>
4行目から12行目がコンポーネントスキーマノードのCurrentDataSource node-refノードの内容に対応しています。

つまりCurrentDataSourceノードの構成はテンプレートのDataSourceグループノードそのものになっています。

それに対してDataSourceHistoryセットノードはDataSourceグループノードそのものではなく、15行目にあるDefaultノードがDataSourceグループノードの構成と同じになっています。

この例ではDataSourceHistoryセットノードの子ノードはDefaultノードひとつしかありませんが、入れ子になっているFieldsセットノードの子ノードはShortNameノードとTypeノードの2つをもっていることがわかります。

セットノードのこれ以外の使い方としてitem要素で子ノードのノード型を限定することができます。

Sets and Templatesにこのitem要素を使ってメニュー項目を再帰的に定義する方法が載っていましたが実際に使っている例はインストールしたLibreOfficeのファイルの中には見つけられませんでした。

参考にしたサイト


util: OOo Registry Document Format
LibreOfficeのConfigurationファイルの解説。

OOoBasic/Generic/Configurations - ...?
OpenOffice.orgのConfigurationファイルの解説ですがとても参考になります。

Performance/Configuration - Apache OpenOffice Wiki
読み込み時にパフォーマンスの向上のためにxcdファイルは誕生したようです。

Extensions/Configuration - ...?
拡張機能のConfigurationファイルを含めるとConfigurationファイルの読み込み順は4層になっています。

次の関連記事:LibreOffice5(31)xcsファイルとxcuファイルとxcdファイル:その2

PR

0 件のコメント:

コメントを投稿