FreeMarker(http://freemarker.org/)は、オープンソースソフトウェアの一つであり、 いわゆる「テンプレートエンジン」と呼ばれるものです。 本システムでは、主にラベルテンプレートから実際の描画・印刷を行う際の変換処理にFreeMarkerを使用しています。
たとえば、
<text string="${goods.nameSpec?html}" position="0, 0" fontName="MS 明朝" fontSize="2" width="33" maxLines="2" />
というラベルテンプレートの記述から、ラベル印刷を実行する際に、「${goods.nameSpec?html}」の部分を 実際の商品名に変換する役割を担います。 この例では単なる「置き換え」に過ぎませんが、FreeMarkerには多彩な機能があり、条件による動作変更や、 繰り返し処理を行わせることができます。
詳細は「http://freemarker.org/」のマニュアルに委ねますが、以下では特に重要ないくつかの機能を紹介します。
値の後ろ側に?に続きビルトイン名と(もしあれば)引数を記述することにより、 値に対して処理を行うことができます。 特に重要なビルトインは「html」です。
string="${goods.nameSpec?html}"
値の中にHTMLマークアップ文字がある場合に、それを実体参照に変換します。 具体的には以下の左の文字を右の文字列に変換します。
< | < |
> | &gr; |
& | & |
" | " |
これにより、たとえばgoods.nameSpecが「特殊な商品名<"1234">」だった場合に、
string="特殊な商品名<"1234">"と展開されるのを防ぎ、正しく
string="特殊な商品名<"1234">"
と、展開されるようになります。
文字列に適用した場合、文字列が空であればfalse、それ以外はtrueを返します。 この機能は後述する#ifとともに利用することができます。
FreeMarkerには様々な命令がありますが、ここでは特に有用な#ifを紹介します。
例<#if goods.name?has_content> <text string="${goods.name?html}" position="0, 0" fontName="MS 明朝" fontSize="2" width="33" maxLines="2" /> <#else> <text string="商品名が未設定です" position="0, 0" fontName="MS 明朝" fontSize="2" width="33" maxLines="2" /> </#if>
上のようにすると、商品名が登録されている場合はそれが表示(印刷)されますが、 登録されていない場合は「商品名が未設定です」と表示(印刷)されます。 通常のプログラミング言語と同様にifの条件によって動作を変更することができるわけです。
例<text string= <#if goods.name?has_content> "${goods.name?html}" <#else> "商品名が未設定です" </#if> position="0, 0" fontName="MS 明朝" fontSize="2" width="33" maxLines="2" />
最初の例を上のように書き直すこともできます。 FreeMarkerのテンプレートはXMLではありませんので、well-formedでなくていいわけです。 テンプレートを処理した結果(展開した結果)が(この場合には)XMLになればよいわけです。