FreeMarker-2.3.23でinterpolation部分をそのまま出力したい。

ただし、テンプレート文字列部分はユーザが自由に入力ができて、さらに、それがFreeMarkerのテンプレートだとは認識していない場合を想定。 つまり、ユーザが${hello}と入力したら、出力結果は${hello}となって欲しい。 調べてみると、下記のようにinterpolation部分を${r"..."}で括ればそのまま出力されるみたい。

TEMPLATE:

${r"${hello}"}

OUTPUT:

${hello}

ということは、ユーザの入力した文字列からinterpolation部分を抽出して、${r"..."}で括るように置換してあげればよさそうだけど、 ユーザが${helloとしか入力しない場合に置換できないし、interpolation部分だけでなく、 <#if>などの制御タグもそのまま出力しなければならないので、この方法はあまり現実的ではなさそう。 で、FreeMarkerのマニュアルを眺めてみると、noparseという項があってそれをみたら「あ、これだ!」となった。 下記のように書くとそのまま出力される。

TEMPLATE:

<#noparse>
  <#if greet>
    ${hello}
  </#if>
</#noparse>

OUTPUT:

<#if greet>
  ${hello}
</#if>

これならユーザが入力した部分を<#noparse>で括ってしまえばいいだけなので簡単。

参考サイト