メタデータ
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メソッドに処理する関数を登録することで、メタデータのレンダリング前後にメタデータの読み出しや変更ができます。