2010-01-08 posted at 3:13pm

Haml 入門

始め Haml の紹介記事を読んだ時、要素の属性の書き方がいけてない (HTML で普通に書くより長いし、あと http-equiv があるときとか) あたりが気に入らなかったのだけど、Haml 2.2 からは HTML と同様に書けると知った (via Haml レシピブック 11の技 - ursmの日記) ので試しに atomos のテンプレートを Haml を使うよう切り替えてみた。

最低限の使い方をメモ。

基本

%h1 What is the Best Template Engine on Ruby?
%p
  The answer is
  %strong Haml

<h1>What is the Best Template Engine on Ruby?</h1>
<p>
  The answer is
  <strong>Haml</strong>
</p>

%{タグ名} で表された要素に対し、内容を同じ行に続けて書くか、次の行からインデントを一つ深くして書くことで包含関係を表現する。

なお、以下のようにこれら二つを同時に用いる書き方は許されていない。

%p The answer is
  %strong Haml

要素の属性

idclass ならば以下のように書くだけでよい。

#header
  %h1#title Evolute
  %p.description Just Another Weblog

要素名が省略された場合は div と見なされる。

それ以外の属性は Ruby のハッシュリテラルを用いて表す。

%html{:xmlns => "http://www.w3.org/1999/xhtml"}

{} の中身は Hash を返す Ruby コードならなんでもよく、

%html{html_attrs('ja')}

とも書ける。( html_attrs{:xmlns => "http://www.w3.org/1999/xhtml", 'xml:lang' => 'ja', :lang => 'ja'} のような値を返す Haml::Helpers のメソッド)

また、上で書いた HTML 風の記法ではこう。

%html(xmlns="http://www.w3.org/1999/xhtml")

属性値の部分にはローカル変数またはインスタンス変数か、引用符で囲んだ文字列が使える。引用符の中では式展開が利用可能。

%a(href=@url)
%a(href="/post/#{@post.id}")

これまで挙げたものを併用することもできる。

%a.permalink(rel="bookmark"){:href => entry.permalink }

Ruby コードの実行結果の埋め込み

%div.comment
  = @comment.content
  %p.meta
    by: #{@comment.username}

= の後に Ruby コードを書くか、式展開を使う。埋め込んだ文字列は :escape_html オプションが設定されていれば HTML エスケープされる。

HTML エスケープするかどうかは & または != の前に置くか、式展開する行の行頭に置いて明示的に指定できる。& なら :escape_html に関わらずエスケープされ、! ならされない。

%div.comment
  &= @comment.content
  %p.meta
    & by: #{@comment.username}

~ は埋め込む文字列に pretextarea のような内容を勝手にインデントされると意味が変わってしまう要素を含む場合に用いる。

%div.post
  %h2= post.title
  ~ post.content

制御構文

- @posts.each do |post|
  %div.post
    %h2= post.title
    ~ post.content

- の後に書く。end は不要。

filed in