Amrita2のフィルター色々
Amrita2のフィルターを調べてみた。以下は自分で試したものだけ。この他にもまだ素晴らしいフィルターがたくさんある。
フィルターとは?
- <<:data | フィルター名称 ...な書式を利用して、:dataの内容に対し、様々な加工をして出力することができる。
- 前回の「サニタイズの制御」もフィルターの機能によるもの。
- フィルター記号「|」で区切って、複数のフィルターを続けて書くことができる。
<<{:index_link => link_to("Index", :action=>:index)}< <<:index_link | NoSanitize | Repeat[3]>> <%# 結果 %> => <a href="/slips">Index</a> <a href="/slips">Index</a> <a href="/slips">Index</a>
デフォルト値の設定
- nilまたはfalseの場合、指定したデフォルト値が利用される。
<<{:tests=>[{:data=>"abc"}, {:data=>nil}, {:data=>"efg"}]}< <<:tests< <<p:data | Default["no_data"]>> <%# 結果 %> => <p>abc</p> <p>no_data</p> <p>efg</p>
printf書式で出力する
<<{:data=>123.456}< <<p:data | Format["(%8.2f)"]>> <%# 結果 %> => <p>( 123.46)</p>
Rubyメソッドの実行
<%# 引数無し %> <<{:data=>"abc"}< <<p:data | :upcase>> <%# 結果 %> => ABC <%# 引数あり %> <<{:data=>Time.now}< <<:data | [:strftime, "%Y-%m-%d"]>> <%# 結果 %> => 2008-02-14
シェルコマンドの実行
- cat -nは、行番号付きで中身を表示するコマンド。
<<{:data=>"abc"}< <<:data | CommandFilter['cat -n']>> <%# 結果 %> => 1 abc
- tidyを利用すれば、HTMLを整形できる!
<%# 通常 %> <<div< <<p.test< %= Time.now.strftime("%Y-%m-%d") <<h1< %= _('Listing slips') <%# 結果 %> => <div><p class = "test">2008-02-13 </p></div><h1>伝票リスト </h1> <%# tidy利用 %> <<div : | CommandFilter['tidy -utf8 -q -xml -indent']< <<div< <<p.test< %= Time.now.strftime("%Y-%m-%d") <<h1< %= _('Listing slips') <%# 結果 %> => <div> <div> <p class="test">2008-02-13</p> </div> <h1>伝票リスト</h1> </div>
子要素間を指定された文字列で接続する
<%# 通常 %> <<div< abc efg hij <%# 結果 %> => <div>abc efg hij</div> <%# Join利用 %> <<div : | Join[' and ']< abc efg hij <%# 結果 %> => <div>abc and efg and hij</div>
自作のRubyメソッドで処理したい
- 新規モジュールprice_helper.rbを作成しておく。
# app/helpers/price_helper.rb module PriceHelper include ActionView::Helpers::NumberHelper def with_delimiter number_with_delimiter(self) end end
- ModuleExtendFilterで拡張して、メソッド呼び出しで処理する。
<<{:data=>"1000"}< <<:data | ModuleExtendFilter[PriceHelper] | :with_delimiter >> <%# 結果 %> => 1,000
- 単にヘルパメソッドで処理するだけなら、ERbでの処理の方がシンプル。
<<{:data=>"1000"}< %= number_with_delimiter($_[:data]) <%# 結果 %> => 1,000
EachとAttr
- Each[:class=>["c1", "c2", "c3"]は、以下を繰り返す。
- 1回目は:class=>"c1"
- 2回目は:class=>"c2"
- 3回目は:class=>"c3"
- Attr[:class]は、指定した属性をタグに設定する。
- この例では:classを指定したので、liタグのclass属性に、ハッシュキーが:classの値を設定する。
<<{:tests=>[{:data=>"abc"}, {:data=>"efg"}, {:data=>"ijk"}, {:data=>"lmn"}]}< <<ul< <<li:tests |Each[:class=>["c1", "c2", "c3"]] |Attr[:class] < <<:data>> <%# 結果 %> => <ul> <li class="c1">abc</li> <li class="c2">efg</li> <li class="c3">ijk</li> <li class="c1">lmn</li> </ul>
- リストの縞々表示とかに役立ちそう。