メタデータ
Wikiページに保存された内容がデータだとすると、最終更新日時や更新したユーザー、ファイルサイズなどは、すべてそのページのメタデータとして扱われます。
保存
DokuWikiはすべてのメタデータを(データベースやレジストリのような)一つの場所にまとめて保存しません。メタデータは基本的にデータファイル自体の情報(たとえば、ファイルサイズ、最終更新日時)であり、その他のメタデータはDokuWikiがmetaディレクトリで管理します。メタデータはページ名に.metaが追加されたファイル名で保存されています。
メタデータの生成
metaディレクトリの情報は最初にメタデータレンダラーによって作成されます。レンダラーは、各ページごとにmetaディレクトリに$id.metaという名前でメタデータを作成します。このファイルはPHPの多次元連想配列で、keyはDublin Coreの要素名に従います。レンダラーはページが保存されたり、indexerによってDokuWiki以外のスクリプトなどでページが追加されると実行されます。
メタデータを Set/Get する関数
メタデータを扱う2つの関数はinc/parserutils.php内にあります。
p_get_metadata($id, $key, $render)はページのメタデータを返します。$idはページIDです。(必須)$keyは取得するメタデータキーです。デフォルトでは false です。キーが渡されない場合にはすべてのメタデータを配列で返します。renderはboolean値で、ページのメタデータが存在しない場合にレンダラーが生成するかどうかを指定します。デフォルトは false です。
p_set_metadata($id, $data, $render, $persistent)はメタデータ内のプロパティを設定します。$idはページIDです。(必須)$dataはメタデータにセットするkey⇒valueペアの配列です。(必須)$renderは boolean 値で、メタデータを生成するかどうかを指定するオプションです。デフォルトは false です。$persistentは boolean 値で、特定のメタデータが次のメタデータ生成まで保持されるかどうかを指定します。デフォルトは true です。
データ構造
現在、コアのメタデータレンダラーが保存している構造は次のようになっています。
- 'title' – string, 最初の見出し
- 'creator' – string, ページの作成者のフルネーム
- 'description' – array
- 'abstract' – 生のWikiテキストの一部分 (250 〜 500 文字)
- 'tableofcontents' – array, 見出し(header)のID('hid')、タイトル('title')、list item 型('type')、見出しのレベル('level')
- 'contributor' array, 編集に関わったユーザーのユーザーID⇒フルネームの配列
- 'date' – array
- 'created' – timestamp, 作成日
- 'modified'– timestamp, 最後の変更日(小変更以外の場合のみ)
- 'valid'
- 'age' – seconds, ページが更新されなければいけない時間まで何秒か('rss'構文でのみ使用)
- 'relation' – array
- 'isreferencedby' – array, このページをリンクしている元ページ。ページID ⇒ boolean (存在するかかどうか)の配列。
- 'references' – array, このページがリンクしているリンク先ページ。ページID ⇒ boolean (存在するかどうか)の配列。
加えて、プラグインもメタデータ要素をサポートしています。現在次のようなものがあります。
プラグイン等で外部からメタデータを扱う場合には、Dublin Core element set のキーを使用することを推奨します。
メタデータの持続性
DokuWikiの内部では、メタデータは2つの配列で管理されており、それぞれcurrent(現在の)とpersistent(保持・持続する)といいます。このpersistent配列には、レンダラーによる処理で削除されるべきでないkey/valueペアが複製されています。p_get_metadata()によるすべてのメタデータ取得処理はcurrentから読み出されます。
Persistentなメタデータには次のようなものがあります。
- 'creator' (ページ作成者)
- 'contributor' (ページ編集者)
メタデータとプラグイン
ここまでで述べたget/setの方法に加え、プラグインがメタデータに関与できる方法が2つあります。
- Syntax Pluginsでは、
render()メソッド内で$format=="metadata"の場合にcurrentページのメタデータを作成できます。 メタデータのkey/valueペアはrenderer->meta配列に追加でき、persistentな値もrenderer->persistentに追加できます。 - Action Pluginsでは、PARSER_METADATA_RENDERメソッドに処理する関数を登録することで、メタデータのレンダリング前後にメタデータの読み出しや変更ができます。