プラグインの作り方

qwikWebのプラグインがどのような仕組みでできているかを説明する。 (qwikWebのinstall方法は省略。とりあえず、普通に起動するところまで動か してください。)

lib/qwik/act-sample.rb というコードが、サンプルコードである。重要なの は最初の3つのmethodである。

プラグイン

まずは一つ目のmethod。

   def plg_tt(text)
     [:tt, text]
   end

これは、ttというプラグインを定義している。

test {{tt(test)}} test

test test test このように、真ん中のtestだけ等幅で表示される。つまり、真ん中のtestだけ、 <tt>というタグで囲まれて表示している。textcreate という表記によって、 "<tt>#{text}</tt>"と表記するのと同じ記述をしているわけだ。これがプラグ インの最も基本的な形である。

ブロックレベル・プラグイン

二つ目のmethod、これはquoteというプラグインを定義している。

   def plg_quote
     text = yield
     ar = []
     text.each {|line|
ar << line
ar << [:br]
     }
     [:blockquote,
[:p, {:style=>"font-size:smaller;"}, *ar]]
   end

quoteプラグインは、先程と違い、ブロックレベル・プラグインである。

{{quote
一行目
二行目
}}

一行目
二行目

このように複数行の入力をとる。最初の text = yield で、プラグインに囲ま れた文字列を取得する。その後、一行づつに分解し、<br/>をお尻につけなが ら、追加しているそして最後にblockquoteタグとpタグで囲んでいる。ついで にstyleも指定している。attributeはこのように、Hashで指定する。

qwikWebではこのように、xmlをArrayやHashなどだけの集合で指定している。 これは高林哲氏による「わびさび方式」をそのまま借りてきたものである。

アクション

ここまでの二つはいわゆるプラグインであり、文中に埋め込んで使うものだっ た。次に、アクションについて説明する。/lib/qwik/act-hello.rbを開くと以下のようにコードが書かれている。

   def act_hello
       c_notice("hello, world!") { "hi, there." }
   end

これがアクション。

http://127.0.0.1:9190/.hello

このURLにアクセスすると、なにかメッセージページがでてくる。タイトルが hello, メッセージがhi, thereとでる。このようにドットで始まるURLは、 act_helloというメソッドの呼び出しに対応している。メソッドの中で実行さ れた結果が、ページとして返ってくる。

実はqwikWebでは、通常のページ表示や編集画面も、全てこのアクションとい う仕組みで作られている。FrontPage.htmlというURLは、FrontPageというペー ジに対してhtmlというアクションを実行せよという意味になる。そこで、 FrontPageというページから文字列を読み込み、htmlに変換して出力している というわけである。(本当はもうちょっと複雑なんだけどね。) FrontPage.editは、FrontPageの編集画面を表示せよ、という意味になる。 qwikWebは、このようなアクションの連鎖だけで全ての処理を実現している。

テストコード

コードの後半は何をやっているかというと、テストコードになっている。

     assert_wiki([:tt, "t"], "{{tt(t)}}")

例えばこのコードは、Wiki記法として{{tt(t)}}という風に記述すると、 その部分は結果的にこのようなhtmlへと変換される、ということをテストして いる。

アクションも同様にテストしている。

     session("/test/.hello")
     assert_tag("hello, world", "title")

これは、.helloというアクションにアクセスして、そこで生成されたページか らtitleというタグをもってくると、その中身はhello, worldというテキスト になっている、ということをテストしている。assert_tagは、"title"という タグを探してきて、その中のテキストを取得し、比較するというassertなわけ だ。

titleタグであれば文中で一つしかないためこの方式で問題ないが、 通常はタグはたくさんあって、それをうまく指定するのは難しい。 そこで、XPathを使ってタグを指定する仕組みも用意している。

assert_xpathでは、XPathを使って検査したい部分を指定し、 その中身をわびさび方式のArrayと比較する。

このような仕組みを用意することによって、テストを自動化することに 成功している。

自動再読み込み

デバッグモード、-dオプション付きでqwikWebを起動すると、ファイルの自動 再読み込み機能がオンになる。この状態で任意のコードを編集し、セーブする と、即座にそのファイルが再読み込みされ、そのコードが有効となる。(正確 には、一秒に一回チェックしている。ファイルが更新されてたら読むという動 作をしている。)

例えば、qwikwebを起動している最中に、先程のttタグのところを、例えば bタグに変える。そうすると、コマンドラインに、reloadをしたというメッセー ジが表示される。

reload: "/cygdrive/c/qwik/lib/qwik/act-sample.rb"

それからブラウザでリロードすると、先程まではttタグだったところがbタグ に変わっているのがわかるはずだ。

このようにサーバを再起動しなくてもコードの変更を反映させられるような仕 組みにしている。これによって、サーバを動作させながらプログラムを更新し ていくことができる。

自分で作ってみる

自分自身のプラグインやアクションを作りたい場合は、最初は試しに act-sample.rbを書き換えながらリロードしていくのがいいだろう。

自分なりのファイルがまとまったら、lib/qwikというdirectoryに、act-から 始まるファイルを作って置けばよい。qwikWebは、自動的にact-から始まるファ イルをロードする。

Happy Hacking!

Last modified: 2006-07-24 Attached files total: 1MB