テンプレートの利用

プログラム本体は(同じ機能のものなら)短ければ短いほどよい。 長い文字列を出力するものは、その文章を別のデータファイルに入れる。

構成が似通った文書を色々なパターンで大量に生成したいとする。 その場合、テキスト全体の出力を全て printf で行なわせると プログラムの見通しが悪くなり、かつ機能追加が困難になる。このような場合、 テキストのテンプレートとなるファイルを作成し、その一部を置き換えつつ 出力するとよい。

HTML文書の生成例

以下のようなメッセージを出すとする。

<html lang="ja">
<head><title>美味しいもの</title>
<link rel="stylesheet" type="text/css" href="foodreport.css">
</head>

<body>
<h1>かれー</h1>
<p class="photo-L">
<img src="curry.png" alt="curry" width="160" height="120"></p>

<p>スパイスを活かしたインド風カレー。</p>
<p>おろしニンニク・おろし生姜たっぷりにタマネギと鷄胸肉を加え火を通す。
ヨーグルトに、.....省略.....ちみも食え。</p>

<div class="footer">
<pre>Copyright 2008 koeki-u nmecha hunters</pre>
</div>
</body>
</html>

(この見本はdelicious.html で見ることができる。)

この書式のテキストを何度も出力すると考える。 なおかつこのうち、下線を引いた部分がその都度変わる部分で、それ以外が 毎回同じものであるとする。テンプレート化する場合、毎回変わる部分を 他と区別しやすいキーワードに置き換えたものにする。

delicious.txt

<html lang="ja">
<head><title>美味しいもの</title>
<link rel="stylesheet" type="text/css" href="foodreport.css">
</head>

<body>
<h1>%menu%</h1>
<p class="photo-L">
%photo%</p>

%text%

<div class="footer">
<pre>Copyright 2008 koeki-u nmecha hunters</pre>
</div>
</body>
</html>

このテンプレートファイル(delicious.txt)を 読み込み、

%menu%品物
%photo% 画像へのIMGタグ
%text%感想の文

のように置換してから出力する一例を以下に示す。

tmpl.rb

#!/usr/koeki/bin/ruby
# -*- coding: utf-8 -*-

STDERR.print "何食べた?: "
menu = gets.chomp

STDERR.print "写真があるならそのファイル名: "
photo = gets.chomp
if photo != "" then
  photo = '<img src="'+photo+'" width="160" height="120">'
end

comment = ""
STDERR.puts "コメントをどうぞ(ピリオドのみの行でおしまい)"
while true
  com1 = gets
  if com1 == ".\n" || com1 == nil then # nilはC-dで入力終了したとき
    break
  end
  comment += com1
end

open("delicious.txt", "r") do |dt|
  while x = dt.gets
    x.gsub!("%menu%", menu)
    x.gsub!("%photo%", photo)
    x.gsub!("%text%", "<p>"+comment.chomp+"</p>")
    print x
  end
end

delicious.txt を用意したうえで実際に起動した様子を示す。

./tmpl.rb
何食べた?: 塩ラーメン
写真があるならそのファイル名: shio.jpg
コメントをどうぞ(ピリオドのみの行でおしまい)
これはさっぱりしていてこってりしていて
もっさりしていてうまい!
.
<html lang="ja">
<head><title>美味しいもの</title>
<link rel="stylesheet" type="text/css" href="foodreport.css">
</head>

<body>
<h1>塩ラーメン</h1>
<p class="photo-L">
<img src="shio.jpg" width="160" height="120"></p>

<p>これはさっぱりしていてこってりしていて
もっさりしていてうまい!</p>

<div class="footer">
<pre>Copyright 2008 koeki-u nmecha hunters</pre>
</div>
</body>
</html>

実験

結果をWebページで確認する。必要な以下のファイルをまず ~/Ruby 内にコピーする。

これらを ~/public_html/food ディレクトリにこぴーする。

cd ~/Ruby
mkdir ~/public_html/food
cp tmpl.rb foodreport.css table_bg.png delicious.txt ~/public_html/food

実験のため、なんでもよいので写真か画像を作り、 ramen.jpgというファイル名で保存する。

保存したファイル(foo.jpg)を適切な大きさに縮小する。

convert -geometry 160x120 ~/foo.jpg ~/public_html/food/ramen.jpg

もう一度プログラムを起動して、出力されるHTMLをファイルに保存する。

cd ~/public_html/food
chmod +x tmpl.rb
./tmpl.rb > ramen.html
何食べた?: 塩ラーメン
写真があるならそのファイル名: ramen.jpg
コメントをどうぞ(ピリオドのみの行でおしまい)
これはさっぱりしていてこってりしていて
もっさりしていてうまい!
.

ramen.html ファイルができていることを確認してから ブラウザ(firefox)で http://roy/~c1yxxxx/food/ramen.html を開いて確認する。

ls -l *.css ramen.html
-rw-r--r--  1 yuuji  252 Jun 29 19:28 foodreport.css
-rw-r--r--  1 yuuji  385 Jul  3 19:59 ramen.html

本日の目次