ゴミ箱.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の変換をするように指定できればよいのだが、それをどうやればよいのか?

続きを読む

スポンサーサイト

PageTop

[webgen]相対パスの指定

このページの情報はwebgen 1.4.0をもとにしています。

階層化されたウェブサイトにおいてCSSのスタイルシートや画像のファイルを含める場合、そのパスの指定は少し厄介である。
例として、以下のような階層構造を持つウェブサイトを構築する。
├─css
│ └─style.css
├─index.html
└─sub1
  └─sub1.html

ここでindex.htmlとsub1/sub1.htmlに共通のテンプレートを適用し、その中で外部CSSとしてファイルcss/style.cssを参照したい。そのときパスの指定はどうするのがいいだろうか。
テンプレートファイル内で<link rel="stylesheet" type="text/css" href="css/style.css" />のように指定したら、index.htmlからはきちんと参照できるが、sub1/sub1.htmlからは参照できない。なぜならsub1/sub1.htmlからの相対パスは../css/style.cssとなるからだ。

では<link rel="stylesheet" type="text/css" href="../css/style.css" />と指定したらどうか?sub1/sub1.htmlからは参照できるが、今度はindex.htmlから参照できなくなってしまう。

それならば絶対パスで<ink rel="stylesheet" type="text/css" href="/css/style.css" />と指定したらどうか?
このウェブサイトがウェブサーバのトップ階層にあるならこれでどちらのページからも参照できる。しかしウェブサイトがトップ以外の階層に配置されたとたん動作しなくなる。
そもそもローカルで参照できないので動作確認もままならない。

その場合、webgenのタグrelocatableを用いることで、webgenのソースフォルダsrcを起点とした絶対パスを、個々のHTMLファイルからの相対パスに変換することができる。
上記の例では、 <link rel="stylesheet" type="text/css" href="{relocatable: /css/style.css}" />のように記述すればよい。
このタグは、index.htmlから参照されたときはcss/style.css、sub1/sub1.htmlから参照されたときは../css/style.cssに変換される。

PageTop

[webgen]すべてのページに共通の属性を付与する

このページの情報はwebgen 1.4.0をもとにしています。

webgenにおいて、HTMLファイルの元となるページファイルにはmetainfo(メタ情報)ブロックを持たせることができ、そこにYAML形式で好きな属性を指定することができる。
詳細はwebgen導入メモ (3) ページ作成編[webgen]複数のコンテンツブロックを使用するあたりを参照すること。

しかし残念なことに、このmetainfoはページファイルごとに個別に指定しなければならない。
ページ共通のテンプレートを用いている場合であっても、テンプレートファイルにおいてmetainfoを定義し、すべてのページに適用するということはできない。([webgen]テンプレートを入れ子にするも参考。)
たとえばウェブサイト名を1箇所だけmetainfoに記述し、それを全ページに一括で適用するということもできないのだ。

…と言いたいところだが、実際にはそのような場合に1箇所だけmetainfoを記述してすべてのページに適用する抜け道が存在する。

続きを読む

PageTop

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

このページの情報はwebgen 1.4.0をもとにしています。

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

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

続きを読む

PageTop

[webgen]テンプレートを入れ子にする

このページの情報はwebgen 1.4.0をもとにしています。

webgenでは、テンプレートを入れ子にして適用することができる。

たとえば、各ページがヘッダ領域、サイドメニュー領域、本文領域という3つの領域に分かれたウェブサイトを考える。
ページはAからDまで4ページあり、本文領域はページごとにすべて内容が異なる。
サイドメニュー領域は2種類あり、ページA、BではサイドメニューX、ページC、DではサイドメニューYが表示される。
ヘッダ領域はすべてのページでまったく同じ。
その際、同じことを2回記述することはできるだけ避けたい。
そのような場合にテンプレートをどう作ればよいか?

続きを読む

PageTop