HTMLテンプレート
目次
HTMLテンプレートとは?
RubyでCGIを作るには以下のメジャーなパターンが考えられます。
ここで紹介するHTMLテンプレートはこの3つとはまた違う新しいパターンです。
- テンプレート用のHTMLをスクリプトで加工する
特徴
- テンプレートのHTMLを読み込み、HTML内の文字列をスクリプトで置換する
- HTMLとスクリプトを完全に分離したのでHTMLは純粋にHTMLとして編集できる
- コメントタグによるブロック指定ができ、スクリプト内でくり返しなどが使える
- シンプルな構造で使いやすいく、意外と高機能
クラス仕様
-
クラスメソッド
-
HTMLTemplate.new(str)
strのHTMLテンプレートを生成します。 -
HTMLTemplate.open(filename)
filenameを読み込んでHTMLテンプレートを生成します。
-
HTMLTemplate.new(str)
-
メソッド
-
block(str){|block| ....value}
<!-- #{str}_begin -->から<!-- #{str}_end -->をblock(HTMLTemplate)として返し、
ブロックを評価した結果valueで置換します。 -
delete!(str)
strを""(空白)で置換します。 -
dup
同じ内容を持つ新しいHTMLTemplateを返します。 -
gsub!(key, value)
keyをvalueで置換します。 -
to_s
Stringを返します。
-
block(str){|block| ....value}
基本例
簡単なリンク集のプログラムを作ってみましょう。
テンプレート用のHTMLとして以下のようなlink.htmlを用意します。
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<link rev="made" href="mailto:tasuku@linux-life.net">
<title>(ここにタイトルが入ります)</title>
</head>
<body>
<h1>(ここにタイトルが入ります)</h1>
<ul>
<!-- link_begin -->
<li><a href="(ここにURLが入ります)">(ここにサイト名が入ります)</a></li>
<!-- link_end -->
</ul>
</body>
</html>
リンクのデータとして以下のようなlink.txtを用意します。
ここでスクリプトで実行するのは
- link.htmlをテンプレートとして読み込む
- "(ここにタイトルが入ります)"を両方ともタイトル名で置換する
-
link.txtを読み込み、
<!-- link_begin -->と<!-- link_end -->の間をテンプレートとして
ファイルの各行に対して"(ここにサイト名が入ります)"を第一列、
"(ここにURLが入ります)"を第二列で置換する。
以上をスクリプトで書くと以下のようなlink.cgiになるのです。
require 'cgi'
require 'htmltemplate'
#CGIクラスの作成
cgi = CGI.new()
#link.htmlをテンプレートとして読み込む
html = HTMLTemplate.open( "link.html" )
#(ここにタイトルが入ります) をタイトルで置換
html.gsub!("(ここにタイトルが入ります)", "HTMLTemplateを用いたCGIのリンク集" )
#ファイルを読み込む
File.open( "link.txt" ) do |file|
#<!-- link_begin --> と <!-- link_end --> をブロックとして置換
html.block( "link" ) do |block|
#各行を読み込んで、加工した配列を連結する
file.collect do |line|
#第一列は名前、第二列はURL
name, url = line.chomp.split(/\t/)
#この行用のテンプレートをコピーして
tmpl = block.dup
#各変数に置換
tmpl.gsub!( "(ここにサイト名が入ります)", name )
tmpl.gsub!( "(ここにURLが入ります)", url )
end.join( "" )
end
end
cgi.out do
#ブロック指定により生成される可能性のある空行を削除して出力
html.to_s.gsub( /\n[\t\s]*\n/, "\n" )
end
実行結果の出力は以下のようになります。
Content-Length: 469
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<link rev="made" href="mailto:tasuku@linux-life.net">
<title>HTMLTemplateを用いたCGIのリンク集</title>
</head>
<body>
<h1>HTMLTemplateを用いたCGIのリンク集</h1>
<ul>
<li><a href="http://www.google.co.jp/">Google</a></li>
<li><a href="http://www.yahoo.co.jp/">Yahoo Japan!</a></li>
</ul>
</body>
</html>
ダウンロード
htmltemplate.rb〜04/03/03 update!
お礼、改良、再配布など大歓迎です。
更新履歴
-
2004/02/07
多少変更(rayさんありがとうございます。) -
2003/05/14
新規作成