Xslateで文字列のマッチ判定

twitterでxslateでの疑問をつぶやいたところ、作者の @__gfx__ さんに解決方法を教えてもらえましたので、メモしておきます。 https://twitter.com/smeghead/status/247267644623949825

前提

Dancer で xslate を使ってます。

やりたかったこと

テンプレートファイル内で、選択中のページの $request.path を使って、メニュー部分のclass属性に、activeを付けるかどうかを判定したい。 トップページかどうかの判定のように、文字列の完全一致でよければ、$request.path == ‘/’ で済むが /area/静岡 とか動的な部分を含むpathの場合は、正規表現の文字列マッチを使いたい。

解決方法

config.xml で、xslateのmoduleに、Text::Xslate::Bridge::Star を追加指定する

engines:
  xslate:
    cache_dir: .xslate_cache/
    cache:     1
    extension: tx
    module:
      - Text::Xslate::Bridge::Star

Xslateを直で使ってる場合は、コンストラクタで、moduleにText::Xslate::Bridge::Starを指定する。

my $tx = Text::Xslate->new(
        module => ['Text::Xslate::Bridge::Star'],
);

テンプレートファイルでは、 “string”.match(rx(‘regexp’) のように使う

    <li class="<: if $request.path.match(rx('/area.*')) {'active'} :>">

まとめ

xslate いいよ。これに慣れると他のテンプレートエンジン使えなくなるくらい。 @__gfx__ さんありがとうございます。

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.