DITA(Darwin Information Typing Architecture)という技術がありまして、その一部として、情報記述単位(DITAでは「トピック」と呼んでいます)のあいだのリンクを自動的に設定・維持するメカニズムが含まれています。
DITAより少し一般性がある自動リンキングが欲しいな、とちょっと考えてみました。以下、用語法はDITAとはまったく違います。リンクは有向グラフで表現できるので、グラフに関する言葉を使っています。
ノードとクラスタ
グラフGは、ノードの集合Nと(有向な)辺の集合Eからなりますが、Nの部分集合をクラスタと呼ぶことにします。クラスタはノードの集合です。以下のグラフでは、クラスタAとクラスタBは領域として描かれています。集合としては、N = {1, 2, 3, 4, 5}、A = {1, 2, 3}, B = {4} です。
クラスタを“メタノード”と考えて、ノードの集合を N∪C としたグラフを考えます。Cはクラスタを表現するメタノードの集合です。クラスタAとクラスタBをメタノードとして描くと次のようになります。N = {1, 2, 3, 4, 5}、C = {A, B}、N∪C = {1, 2, 3, 4, 5, A, B} です。
通常ノード(楕円)とクラスタノード(四角)のあいだの点線の辺は所属関係を表します。「ノード : クラスタ = ファイル : ディレクトリ」という類比で考えるといいでしょう。
クラスタのなかに再帰的にクラスタも入れられるとすると、所属関係のグラフはツリーとなります。ノードだけ、またはクラスタだけを含むクラスタを一様(uniform, homogenous)、そうでないクラスタを混合(mixed, heterogenous)と呼ぶことにします。
リンキング属性
以下では、ノードとは通常ノード(親子関係の末端)だけでなくてクラスタノードも含めます。各ノードは、リンキングを制御するための属性を持つとします。それは次のようなものです。
- allowsTarget : リンクのターゲットとなることを許すか。値は、yes, no, noautoのどれか。
- yes : リンクのターゲットにしても良い。
- no : リンクのターゲットにはなれない(リンク禁止)。
- noauto : 自動リンクのターゲットにはなれないが、明示的なリンクのターゲットにはなれる。
- allowsSource : リンクのソースとなることを許すか。値は、yes, no, noautoのどれか。値の意味はallowsTargetと同様。
クラスタノードには、次のリンキング属性もあります。
- targetSet : 自動リンクのターゲットとなるメンバーノードの集合。値は、all, main またはノード名(ID)の配列。
- sourceSet : 自動リンクのソースとなるメンバーノードの集合。値は、all, main またはノード名(ID)の配列。値の意味はtargetSetと同様。
これらの属性の値に基いて、「クラスタとクラスタのあいだのリンク」を、メンバーのあいだのリンク達に変換することができます。変換のアルゴリズムは書きませんが、想像はできるでしょう。
内部リンキング
クラスタに属するメンバーノードのあいだのリンクを自動的に生成するヒントとして、次の属性があります。
- autoLinking : 内部リンクをどのように作成するか。値は、discrete, complete, ordered。
- discrete : 内部リンクを作らない。リンクのグラフは離散グラフになる。
- complete : すべてのノードをリンクする。リンクのグラフは完全グラフになる。
- ordered : ノードの集合が全順序集合だとして、その全順序に従ってリンクする。
- direction : autoLinkingがorderedのとき、隣接するa, bの順序 a<b に対して a→b とするか a←b とするか。値は forward, backward, both。
- forward : a<b に対して a→b とする。
- backward : a<b に対して a←b とする。
- both : 両方向とする。
- cyclic : autoLinkingがorderedのとき、最後から最初に戻るリンクを付けるかどうか。値は true, false。
*1:DITAで関連性テーブル(reltable)と呼ばれている概念です。