はじめに
この記事は @eggc さんの以下の記事に触発されて書いたもの。
slim ちょっと試したいときには slimrb を使う - Qiita
要するに,テンプレートエンジン Slim で,「こう書いたらこうなる?」というのをコマンドラインでサクッと確かめるには,slim gem によって導入される slimrb というコマンドを使えばよい,ということ。
この方法は,とにかくシンプルで,二三度やってみれば覚えられるから,「ええと,どうやるんだっけ?」と悩む必要がない1。
ただ,これだとややこしい Slim コードを少しずつ修正しながら結果を確認するのが面倒くさい。
試行錯誤をもっと楽にしたい,というのが本記事の趣旨。
スクリプトで変換する
slim のほか,listen というディレクトリー監視の gem が必要なので
gem install slim listen
で入れておく。
そして以下のスクリプトを走らせる。
require "listen"
require "slim"
this_file = File.expand_path(__FILE__)
Slim::Engine.set_options pretty: true
Listen.to(__dir__) do |(m, *_),|
next unless m == this_file
IO.read(this_file) =~ /^__END__$/
puts Slim::Template.new{$'}.render, "---"
end.start
sleep
__END__
- 3.times
div わん
__END__
の下に Slim コードが書かれている。
これだけでは何も起きないが,試しにこの Slim コードを変更してみよう。改行を足すだけでもいい。
変更して保存すると,変換した結果の HTML と区切り線 ---
がターミナルに表示される。
変更して保存するたびに表示される。
Slim コードは別ファイルにしてもいいのだが,全部を 1 ファイルにまとめてみた。
なお,Slim の変換のモードとして,
Slim::Engine.set_options pretty: true
のように,改行・インデントが入る形式を指定している。
改行・インデントを入れない形式にしたければ,この行をコメントアウトすればいい(こういう変更を行った場合はスクリプトを一度終了して再度動かすこと)。
コードの解説
ファイルの変更を監視するため,listen を使う。
Listen.to
は,引数に監視ディレクトリーのパスを与えておくと,そこでファイルの変更・追加・削除があった場合に,それらのファイルのパスをブロックパラメーターとしてブロックを評価してくれる。
ブロックパラメーターは順に,①変更ファイルのパスの配列,②追加ファイルのパスの配列,③削除ファイルのパスの配列。
なんで配列なのかというと,一定時間おきにチェックして,前回チェックとの差分を見るわけなので,一般には複数のファイルが変更・追加・削除されうるから。
監視を始めるには Listen.to
の返り値に対し,start
してやらなければならない。
ブロックパラメーターが |(m, *_),|
と変な形をしているけど,これは第一ブロックパラメーター以外を捨てる,ということと,第一ブロックパラメーターについては,配列の先頭のみを m
に当てて,残りを _
で受けて捨てることを意味している。
そして,スクリプトファイル自身をテキストデータとして取得し,正規表現 /^__END__$/
にマッチする箇所を探して,そこ以降のテキストを $'
で取り出している。
Slim コードを HTML に変換するには,Slim::Template.new
のブロックに Slim コードを与え,render
すればいい。
なお,スクリプト末の sleep
が無いと,スクリプトは一瞬で終わってしまう。
-
コマンド名が思い出せなければ
gem spec slim
で slim gem の情報を表示し,executables
のところを見ればslimrb
と出ている。 ↩