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>
  • リストの縞々表示とかに役立ちそう。