Tenjinテンプレートエンジンで快適Web制作
IWDD41で「Tenjinテンプレートエンジンで快適Web制作」として発表してきました。
VGAアダプタを忘れてプロジェクタに映せなかったので(><)、blogにコードを貼ってみます。
素のHTMLを何ページも手書きしたくない、CMSを入れる程でもない、DreamWeaverテンプレートでは物足りない。 デザイナーでもテンプレートエンジンを使いこなしたい。Rubyを使いたい。そんな人にお勧めです。
今年はもっとRubyを勉強しようと思っているので、Ruby用のrbTenjinを使ってデモを書きました。
IWDDで発表した内容は
- 基本的なTenjinの使い方
- ヘッダ、本文、フッタの3ファイルに分ける方法
- エクセルファイルからデータを読み込んでHTMLページ生成
- YAMLファイルからデータを読み込んでHTMLページ生成
- CGIのパラメータを受け取ってページの内容を変える
基本的なTenjinの使い方
テンプレートファイルの中で
- ${...}と書けばrubyの式を評価した結果が入る(HTMLエスケープ有り)
- #{...}と書けばrubyの式を評価した結果が入る(HTMLエスケープ無し)
- <?rb ... ?>でrubyの文を埋め込める
Apacheで使うための設定
今回はCGIとして動かして、そのCGIの中でTenjinを使っていきます。
- Tenjinを動かすためのパーサとしてのCGI
- apacheで動かすための.htaccessファイル
- テンプレートファイル
まず、1.Tenjinを動かすためのCGIを http://dekstop.de/weblog/2006/01/rhtml_on_osx_with_apache_and_erb/ を参考にして書いてみます。これを「tenjin.cgi」とかの名前で保存しておきます。CGIがテンプレートファイルを受け取って、Tenjinに渡してレンダリングした結果を表示しています。
#!/usr/bin/ruby
$KCODE = 'utf-8'
require 'time'
# require 'rubygems' # 必要ならば
require 'tenjin'
time = Time.now.httpdate
HEADERS = <<EOF
Date: #{ time }
Server: #{ ENV['SERVER_SOFTWARE'] }
Last-Modified: #{ time }
Content-Type: text/html
EOF
begin
path = nil
if (ENV['PATH_TRANSLATED'])
path = ENV['PATH_TRANSLATED']
else
file_path = ENV['REDIRECT_URL'].include?(File.basename(__FILE__)) ? ENV['SCRIPT_URL'] : ENV['REDIRECT_URL']
path = File.expand_path(ENV['DOCUMENT_ROOT'] + '/' + file_path)
raise "Attempt to access invalid path: #{path}" unless path.index(ENV['DOCUMENT_ROOT']) == 0
end
tenjin = Tenjin::Engine.new(:cache => false) # キャッシュ機能は今は外しておく
output = tenjin.render(path) # テンプレートをレンダリングする
print HEADERS + output # レンダリング結果を出力
rescue Exception
# エラーが発生した場合
print "Content-Type: text/html\n\n"
# error message
print "<h1>Script Error</h1>"
print "<pre>#{ $! }</pre>"
# debug info
print "<h2>Backtrace</h2>"
print "<pre>#{$!.backtrace.join("\n")}</pre>"
print "<h2>Environment</h2>"
print "<pre>#{ENV.keys.map { |key| key + ' = ' + ENV[key] + "\n"} }</pre>"
print "<hr>"
print "<i>#{__FILE__} -- #{time}</i>"
endtenjin.cgi
apacheで動かすための.htaccessファイル
Apacheのmod_actionを使って、htmlファイルへのアクセスを、tenjin.cgiに渡すようにします。テンプレートファイルの拡張子は.rhtmlとかでも良いのですが、.htmlにしておくと、URLの見た目的にも、エディタでの扱いやすさ的にも良いと思います。
Options +ExecCGI AddHandler tenjinpage .html Action tenjinpage /tenjin.cgi
.htaccess
ここまで出来たら準備完了です。テンプレートファイルを作って、動作確認してみます。
<?rb aaa = 'こんにちはー' ?>
<html>
<head>
<title>${aaa}</title>
</head>
<body>
${aaa}
</body>
</html>test.html
こんなHTMLファイルを作って、 http://localhost/test.html にアクセスしてみると、変数aaaの内容が${aaa}で評価されて、ブラウザには
<html>
<head>
<title>こんにちはー</title>
</head>
<body>
こんにちはー
</body>
</html>という内容が返ってくると思います。
毎回CGIを呼び出しているので、スピードが気になる場合は、レンダリング結果を静的ページとして保存してしまうのも良いと思います。