FreeMarkerの機能

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」です。

html

string="${goods.nameSpec?html}"

値の中にHTMLマークアップ文字がある場合に、それを実体参照に変換します。 具体的には以下の左の文字を右の文字列に変換します。

< &lt;
> &gr;
& &amp;
" &quot;

これにより、たとえばgoods.nameSpecが「特殊な商品名<"1234">」だった場合に、

string="特殊な商品名<"1234">"
と展開されるのを防ぎ、正しく
string="特殊な商品名&lt;&quot;1234&quot;&gt;"

と、展開されるようになります。

has_content

文字列に適用した場合、文字列が空であれば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になればよいわけです。