HTML テンプレート @ Ruby - Linux Life

HTML テンプレート とは?

Ruby で CGI を作るには以下のメジャーなパターンが考えられます。

  • CGI スクリプトに HTML を埋め込む
  • HTML に Ruby のスクリプトを書く埋め込む

ここで紹介する HTML テンプレート はこの3つとはまた違う新しいパターンです。

  • テンプレート用の HTML をスクリプトで加工する

特徴

  • テンプレートの HTML を読み込み、HTM L内の文字列をスクリプトで置換する
  • HTML とスクリプトを完全に分離したので HTML は純粋な HTML として編集できる(はず)
  • コメントタグによるブロック指定ができ、スクリプト内でくり返しなどが使える
  • シンプルな構造で使いやすいく、意外と高機能

API

  • クラスメソッド
    HTMLTemplate.new( str )
    str の HTML テンプレート を生成します。
    HTMLTemplate.open( filename )
    filename を読み込んで HTML テンプレート を生成します。
  • メソッド
    block( str ){ |block| ... value }
    <!-- #{str}_begin -->から<!-- #{str}_end -->を block(HTMLTemplate)として返し、 ブロックを評価した結果 value で置換します。
    delete!( str )
    str を削除します。
    dup
    同じ内容を持つ新しい HTMLTemplate を返します。
    gsub!( key, value )
    key を value で置換します。
    to_s
    String を返します。

基本例

簡単なリンク集のプログラムを作ってみましょう。

テンプレート用の HTML として以下のような link.html を用意します。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xml:lang="ja" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>(ここにタイトルが入ります)</title>
    </head>
    <body>
        <h1>(ここにタイトルが入ります)</h1>
        <ul>
<!-- link_begin -->
            <li><a href="(ここにURLが入ります)">(ここにサイト名が入ります)</a></li>
<!-- link_end -->
        </ul>
    </body>
</html>

リンクのデータとして以下の link.txtを用意します。

Google Japan    http://www.google.co.jp/
Yahoo Japan!    http://www.yahoo.co.jp/

CGI スクリプトで実行するのは

  • link.html をテンプレートとして読み込む
  • "(ここにタイトルが入ります)"を両方ともタイトル名で置換する
  • link.txt を読み込み、 <!-- link_begin -->と<!-- link_end --> の間をテンプレートとして ファイルの各行に対して "(ここにサイト名が入ります)" を第一列、 "(ここにURLが入ります)" を第二列で置換する。

以上をスクリプトで書くと以下の link.cgi になります。

#!/usr/bin/ruby
require 'cgi'
require 'htmltemplate'
#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 )
            #最初の改行をひとつ取り除く
            tmpl.to_s.sub( /^\n/, '' )
        end
    end
end
#CGIクラスの作成
cgi = CGI.new()
cgi.out do
    html.to_s
end

実行結果は以下のようになります。

Content-Type: text/html
Content-Length: 575
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xml:lang="ja" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>HTMLTemplateを用いたCGIのリンク集</title>
    </head>
    <body>
        <h1>HTMLTemplateを用いたCGIのリンク集</h1>
        <ul>
            <li><a href="http://www.google.co.jp/">Google Japan</a></li>
            <li><a href="http://www.yahoo.co.jp/">Yahoo Japan!</a></li>
        </ul>
    </body>
</html>

ダウンロード

htmltemplate.rb

スポンサードリンク

Copyright © 2025 Linux-Life.net