プログラム本体は(同じ機能のものなら)短ければ短いほどよい。 長い文字列を出力するものは、その文章を別のデータファイルに入れる。
構成が似通った文書を色々なパターンで大量に生成したいとする。
その場合、テキスト全体の出力を全て printf
で行なわせると
プログラムの見通しが悪くなり、かつ機能追加が困難になる。このような場合、
テキストのテンプレートとなるファイルを作成し、その一部を置き換えつつ
出力するとよい。
以下のようなメッセージを出すとする。
<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
で見ることができる。)
この書式のテキストを何度も出力すると考える。 なおかつこのうち、下線を引いた部分がその都度変わる部分で、それ以外が 毎回同じものであるとする。テンプレート化する場合、毎回変わる部分を 他と区別しやすいキーワードに置き換えたものにする。
<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% | を | 感想の文 |
のように置換してから出力する一例を以下に示す。
#!/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
というファイル名で保存する。
gimp&
)~/foo.jpg
とする。~/foo.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