ゴミ箱.net

汚物は消毒

[webgen]ページファイル、テンプレートファイルのブロックの処理を変更する

webgenのページファイルやテンプレートファイルのコンテンツブロックは、デフォルトではページファイルがMarkdown、テンプレートファイルが素のHTML(ただし完全なHTMLでない場合は断片として扱われ、<html>やら<body>やらでラップされるようだ)として扱われる。普通にwebgenを使う場合はこの動作でだいたい事足りるので、利用者は深く考える必要はない。webgen導入メモ (3) ページ作成編を参照。

だが、その動作が余計なお世話になることがたまにある。
たとえば、ページファイルにおいてMarkdownでは表現しきれないような複雑なHTMLを記述したい場合。(まあこの場合は、ブロック全体を<div>で括ってやることで、Markdown処理エンジンのKramdownがその部分を無視してくれるという手が使えるのだが。)
ほかには、テンプレートファイルでページの一部(または全部)をMarkdownで記述したい場合。以下に例を示す。
default.templateに以下のように記述する。
<html>
<body>
メニュー
<webgen:block name="sideMenu" notfound="ignore" node="current" />

<webgen:block name="content" />
</body>
</html>
--- sideMenu
- [ほげ](foo.html)
- [ぴよ](bar.html)
- [ふが](baz.html)
意図としては、sideMenuブロックをMarkdownで記述し、それをページ全体のHTMLに埋め込みたい。
しかしこのまま実行すると、sideMenuブロックはHTMLに変換されずにそのままの形でテキストとして埋め込まれてしまう。
その場合、sideMenuブロック限定でMarkdownの変換をするように指定できればよいのだが、それをどうやればよいのか?

そもそもブロックを変換する機能はどのように定義されているのか?
webgenに含まれているファイル passive_sources/default.metainfo を見ると、以下のように記述してある。

/**/*.template:
handler: template
blocks: {defaults: {pipeline: [erb,tags,blocks,html_head]}}

/**/*.page:
handler: page
blocks: {defaults: {pipeline: [erb,tags,kramdown,blocks,fragments]}}
このdefaultsというのがすべてのブロックに適用されるデフォルトの設定で、pipelineというのがページの内容を変換する機能(コンテンツプロセッサ)の指定だ。
コンテンツプロセッサの詳細はwebgenの資料を参照すること。
コンテンツプロセッサには以下のようなものがある。
  • erb: 埋め込みRuby
  • tags: Webgen独自のタグの処理 {hoge:}のような書式のもの
  • blocks: <webgen:block>タグの処理
  • kramdown: MarkdownをHTMLに変換する
この設定を見ると、上記の設定でMarkdownの処理がされないのは、拡張子が.templateで終わるテンプレートファイルのブロックのpipelineにkramdownがないからだというのが分かる。

この場合、対象のブロックのpipelineを置換し、Markdownを処理するようにしてやればよい。
テンプレートファイルのメタ情報にblocksという属性を追加し、そこでブロック名をキーとしたハッシュを指定する。ブロック名に対して属性名と属性値のハッシュを指定する。属性pipelineに必要な処理のリストを指定する。
具体的にはこうだ。
ファイルの先頭にブロック区切り---を入れることで、最初のブロックがメタ情報とみなされることに注意。
---
blocks:
sideMenu:
pipeline: [erb,tags,kramdown,blocks]
---
<html>
<body>
メニュー
<webgen:block name="sideMenu" notfound="ignore" node="current" />

<webgen:block name="content" />
</body>
</html>
--- sideMenu
- [ほげ](foo.html)
- [ぴよ](bar.html)
- [ふが](baz.html)

簡便な方法として、メタ情報ブロックを記述せず、ブロック区切りの後ろに属性を追加する方法もある。
書式がYAMLとも微妙に違うので嫌な感じだ。
<html>
<body>
メニュー
<webgen:block name="sideMenu" notfound="ignore" node="current" />

<webgen:block name="content" />
</body>
</html>
--- name:sideMenu pipeline:erb,tags,kramdown,blocks
- [ほげ](foo.html)
- [ぴよ](bar.html)
- [ふが](baz.html)
スポンサーサイト

PageTop

コメント


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