ゴミ箱.net

汚物は消毒

[webgen]複数のコンテンツブロックを使用する

webgenでは、ページファイルとテンプレートファイルにおいてメタ情報ブロックとコンテンツブロックという領域を分けて記述することができた。
ファイルの先頭およびブロックの区切りに「---」を記述することでメタ情報ブロックとコンテンツブロックに分かれていることを示すことができる。
---
※メタ情報ブロック
---
※コンテンツブロック
なお区切りが一切ない場合はファイル全体がコンテンツブロックとなる。

このコンテンツブロックだが、実際には任意の個数定義することができる。
これによってテンプレートの複数の箇所にHTMLを埋め込んだり、繰り返し出現する文言をコンテンツブロックとして複数個所に埋め込んだりといったことができるのだ。

コンテンツブロックを複数個定義するには、以下のように記述する。

---
※メタ情報ブロック
--- コンテンツブロック名1
※コンテンツブロック1
--- コンテンツブロック名2
※コンテンツブロック2
--- コンテンツブロック名3
※コンテンツブロック3
(後略)
コンテンツブロックの直前にある区切りの後ろに、半角空白を空けてコンテンツブロック名を記述することで、名前を指定することができる。
名称は省略することができ、その場合はcontent、block2、block3、…という名前が自動的に設定される。

ファイル先頭に区切りがない場合はメタ情報ブロックがなく、すべてコンテンツブロックとして認識される。
※コンテンツブロック1
--- コンテンツブロック名2
※コンテンツブロック2
--- コンテンツブロック名3
※コンテンツブロック3
(後略)

ページファイルまたはテンプレートファイルにおいて定義した個々のコンテンツブロックは、テンプレートの連鎖における直後のテンプレートファイルにおいてタグを指定することで埋め込むことができる。
テンプレート中のコンテンツブロックを埋め込みたい箇所に
<webgen:block name="コンテンツブロック名" />
と記述する。

直前のページまたはテンプレートにおいて該当する名称のコンテンツブロックがない場合はエラーとなってしまう。これを防ぐには属性notfound=ignoreを設定するとよい。
<webgen:block name="コンテンツブロック名" notfound="ignore" />

注意点として、テンプレートが入れ子になっている場合は連鎖の直前のページファイルまたはテンプレートファイルのコンテンツブロックしか参照できない。
たとえば「ページ→テンプレート1→テンプレート2」のような連鎖がある場合、「テンプレート2」において「ページ」で定義されたコンテンツブロックを直接参照することはできないのだ。
このような場合は、途中の「テンプレート1」において「ページ」と同名のコンテンツブロックを定義し、そこには
<webgen:block name="コンテンツブロック名" />
とのみ記述することで、「ページ」のコンテンツブロックの内容をそのまま受け渡せばよい。

同一のページファイルまたはテンプレートファイルで定義されたコンテンツブロックを、他のコンテンツブロック内で参照することもできる。ウェブページ内で同じ内容を繰り返し記述したい場合に有効だろう。
方法はタグwebgen:blockにおいて属性nodeにcurrentを指定する。
<webgen:block name="コンテンツブロック名" node="current" />

この属性nodeにはほかの使い道もある。
他の出力ファイルの名称を指定することで、そのファイルの元になったページファイルで定義されたコンテンツブロックを埋め込むこともできる。
<webgen:block name="コンテンツブロック名" node="foo.html" />
と書けばページファイルfoo.pageで定義されたコンテンツブロックの内容が埋め込まれる。

最終的なHTMLファイルに出力される内容は、テンプレートの連鎖の最後のテンプレートにおける、名称が「content」であるコンテンツブロックの内容となる。
「ページ→テンプレート1→テンプレート2」のような連鎖であれば、「テンプレート2」における名称が「content」であるコンテンツブロックの内容が、最終的なHTMLファイルの内容となる。
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する