高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

これは発明!…かも

 わたしは前から、テンプレートを読み込み、それを処理するという方式でCGIを作ってきました。そのことは前にも書いたとおりです。
わたしのテンプレートは、主に二つの要素で成り立ってます。

  • 透過タグ*1
  • スプリッタ

 それぞれは以下のような書式になっています。

  透過タグ
  <#name>

 えっと…。Delphiのまんまです(^_^;)

  スプリッタ
  <!--#name--> 文章 <!--name#-->

 <!--#という書き方がSSIとかぶってますが、それはいいとして。
 まあ、早い話が何らかの処理結果を透過タグと置き換えるわけです。
スプリッタは、複数のテンプレートを、一つのファイルに内包するための仕組みです。スプリッタを使って切り取ってきた部分的なテンプレートを使用して、処理。結果を透過タグと置き換える…これを繰り返してCGIを動かしています。

 いちおうスプリッタをすべてテンプレートから切り分ける処理*2と、透過タグの展開処理*3は関数化してあります。


 さて、ここまでは前置き。今日は透過タグの読み込みエンジン(というほど大層なものではないですが)をいじって、透過タグに引数をつけられるようにしました。

  <#name param>

 とか言う感じです。そして

  <#name param1 param2>

 ということも出来ます。
 引数が渡された透過タグは、どういう風に処理をするのかというと、注釈には書きましたが置き換えにはハッシュリストを使っていますので、そこに、サブルーチンのリファレンスを値として持つキーを追加するのです。

  $vars{fileinclude} = \&fileIO::load;

 みたいな感じで。
すると、fileincludeという透過タグがあったときに、その引数がサブルーチンに渡されて(この場合&fileIO::load)、そのサブルーチンの戻り値で、透過タグを展開できるんですねー。

 こんな仕組みを作っちゃったものだから、もしかしたらちょっとした動作で、SSI風のファイル埋め込みとか、ログファイルを読み込んでリスト風に表示するとか、何でも簡単にこなせるわけです。
上の例なら<#fileinclude /log/text.txt>と書いただけで、"/log/text.txtを読み込んでそれを表示する"ことが出来ますし、同じ要領で、"ログファイルを読み込んで、それをHTMLに直してから返す"というサブルーチンを作れば、一発でリスト風のページを作るCGIも作成可能になります。

 我ながらこれはちょっとした発明かも。あらかじめよく使いそうな処理をパッケージにしたCGIファイルを公開しておけば、Perlを知らない人でも、テンプレートさえ書ければCGIが作れるということになります。まあ、所詮はDelphiのTPageProducerの真似ですが、これだけ楽に出来るCGIって、見たことないですし。
id:TakamiChie:20050217でもちょっと書いたデータ形式と併せて、わたし流のCGIの基礎が組み立てられてきたという感じ。


 あっちにも書いたとおり欠点は、どうしてもリファレンスの使い方が分かってないと、内部をいじれないということくらいでしょうか。
 …今後いろいろと書き換えていくと思うので、これらCGI群の公開は、まだまだ後回しになりそうです。おんぷ村に使ったCGI全部公開なんていうと、なにやら問題になりそうですが、一応学校でも、「この仕組みを後輩が使えるようにドキュメント化を…」なんて言われちゃったので、この辺はドキュメント化と、サンプル作りもした方がいいかもですね。
まあ、締め切りは特にないらしいし、万博が終わる頃にでも…。

*1:元ネタはDelphiのTPageProducer

*2:上の場合name = 文章 という感じでハッシュリストに納めます

*3:引数として渡したハッシュリストに、文中にある透過タグと同名のものがあれば、それをハッシュの値と交換する。正規表現で説明するなら”$text =~ s/<#$key>/$val/g;”ですね