HTMLテンプレート

部下の作っているシステムの関係で、バッチ用のHTMLテンプレートシステムを作る。

元々、オンライン用のものは作っていたので、それがバッチで動くようにしただけ。と言っても、「データをどこからどうやって注入してやるか」ということがあるので、当然ながらそのままは使えない。まー、ファイルからデータを読み込む汎用ルーチンを作っていたので、それを流用するだけだ。実質3時間程度でできる。汎用ルーチンはありがたいもので、CSVだろうがXMLだろうが、COBOLデータだろうが、関数呼出し一発で済む。当然国際化もしてある。

そんなわけでできたものを使わせていたら、変数を参照するところで「配列を配列の値で参照したい」と言い出す。元々のシステムは配列はそのまま「なんか特殊な記号が混ざってる名前」という把握でやっていたのだが、「配列の配列」を実現するためには、マジメに式を評価してやらないといけない。となると、式の解析をして… となって、結構面倒。

面倒は面倒なんだけど、そんなことはミドルウェアでやっておかないと、アプリケーションにいらない手間がかかってしまって嫌なので、適当に過去に書いた処理系からいろいろパクって来て、まじめに式を評価するルーチンを書いてしまう。ついでに配列の参照だけではなくて、演算もできるようにしたので、


<fixed name="foo.val[foo.item[#1]+1] + foo.val[2]">

みたいな表記を可能にした。式になっているのに"name"なんて属性もおかしいが、まぁこれはご愛敬ということで。

この作業は昨夜始めたんで、実質12時間はかかってない。本当は4時間くらいで動いたんだけど、どうも多次元配列を使いたそうな空気を感じたので、その辺を見直して書き直したので、それくらいかかってしまった。

しかし、ここまでやると、「ここに任意のRubyの式を」とか言い出すような気がして、ガクガクブルブル(AA略)だ。それをやってもそう大変ではないのだが、オンラインとコードを共用しているし、同じように動かすにはそれは必須だから、余計なオーバーヘッドがかかってしまうので嫌なのだ。「富豪でやれ」という声が聞こえて来そうだけど、こちとら貧民なもんで。

ちなみにこのテンプレートシステム、実はコンパイラになっている。最初のパスでテンプレートをバイトコードにコンパイルして、それを実行する時に埋め込み処理をしている。なんでそんなことをするかと言えば、文字コードは「self insert」だとみなして実行すると、いろんなところが手抜きできるからだ。

ところが、今回入れた機能はインタープリタになっているものだから、コンパイラにインタープリタが混ざっている形になって、なんかかこわるい。とは言え、直すとえらい手間だしなぁ。将来の課題ということで。