ヘッダとフッタ
Kidはアプリケーションのヘッダとフッタを作るためのいくつかの方法を提供してくれます。ここでは2つのアプローチに注目してみましょう: かっこいいアプローチと早いアプローチの2つです。
Kidには本当に本当に便利なコマンドであるpy:matchがあります。これがこれほど便利なのは、個々のページテンプレートをサイトワイドなスタイルを気にすることなく書くことができるという点です。クイックスタートコマンドではこのようなセットアップはまだ行われていません。
まずはヘッダやフッタを適用したいページのテンプレートを見てみましょう。(これはgs/templates/welcome.kidをベースにしています):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
py:extends="'master.kid'">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type" />
<title>Welcome to TurboGears</title>
</head>
<body>
<h2>You're running TurboGears!</h2>
<p>Your TurboGears server is running as of <span py:replace="now">now</span>.</p>
<div py:replace="phraseOfTheDay()"/>
</body>
</html>
このテンプレートでヘッダやフッタを適用する必要があるのは、HTMLタグ内のpy:extends だけ です。Kidはあるテンプレートを拡張したり、他のテンプレートのサブクラスにすることを可能にしてくれます。そのようにすると、テンプレートは親テンプレートのpy:matchやpy:defブロックを継承します。py:extendsは現在のテンプレートから相対的にファイルや、importしたテンプレートモジュールオブジェクトを探します。
それではマスターテンプレートはどうなっているのでしょう?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type" />
<title>Your title goes here</title>
</head>
<body py:match="item.tag=='{http://www.w3.org/1999/xhtml}body'">
<h1>TurboGears is Running</h1>
<div py:def="phraseOfTheDay()">There's no better time than the present!</div>
<p>This text appears in the header provided by master.html.</p>
<div py:if="tg_flash" class="flash" py:content="tg_flash"></div>
<div py:replace="item[:]"/>
</body>
</html>
このマスターテンプレートは、個々のページテンプレートと同様、ブラウザで見ることができます。bodyにあるpy:match属性は子テンプレートのbodyを探します(XML名前空間に注意してください)。py:match宣言の中では、 "item" がドキュメント内の 要素 へのアクセスを可能にしています。それが当該のものかどうかを確かめるために、要素のタグや属性を(item.attribを通して辞書スタイルで)見ることができます。この場合でいえば、body要素を引き継ぐことになります。
マッチしたものが見つかると、子テンプレート(個々のページ)のbodyはマスターテンプレートのbodyで 置換されます 。ではそこではどのようにコンテンツが得られるのでしょう?このマスターテンプレートの末尾を見てみると、 "item[:]?" で置換されるdivがあります。この特別な例では、これは、そのページテンプレートのbodyの 中にあるものすべて をマスターテンプレートのこの部分に置くことを意味しています。たいていはすべての要素をおきたいでしょうから、item[:]?を使うことになるでしょう。
Kidにはテンプレートの間で共有するアプローチもあります: これがテンプレート関数です。これらは普通のテンプレート関数と同じように動作し、マスターテンプレートから継承されます。これは上記の例でいう: phraseOfTheDayに相当します。
phraseOfTheDayはマスターテンプレートの中でpy:defとして定義されています。ページテンプレート内ではこれがpy:replaceとして現れます。これによって子テンプレートのdivは、マスターテンプレートのdivによって置換されることになるでしょう。これによってヘッダやフッタ、あるいはサーチボックスなどを簡単に実装することができます。
テンプレート関数はPython関数と同じように引数を取ることもできます。例えば見出しをフォーマットするために子テンプレートからtitleを渡してもらうことができます。

