No Programming, No Life

プログラミング関連の話題や雑記

GroovyでどうせならStringを拡張してテンプレートにしちゃえばいいじゃない

はじめに

サクっとテンプレートエンジンを使いたいなって時、ありますよね。Groovyの場合、GStringがあるから、あらかじめ宣言された変数値を文字列に埋め込むことは簡単なんですが、後からMapにしといてバインドしたい!って用途が実は結構あったりする気がする。

Groovyにはテンプレートエンジンがある

以前こちらの記事で書いたのようにすればファイルからテンプレートとして読み込んでごにょごにょできるのですが、サクっと使いたい場合にはちょっとまどろっこしいですよね。

一番シンプルな方法は何か

考えてみたら、テンプレートとして使いたいStringインスタンスから直接パースしちゃえばいいんですよね、ということでやってみました。(ソースはこちら)

動作確認: Groovy Version: 1.7.6 JVM: 1.6.0_22

// Stringを拡張してバインド変数のマップを渡してパースできるようにする
String.metaClass.parse = { Map binding = [:] ->
  new groovy.text.SimpleTemplateEngine()
    .createTemplate(new StringReader(delegate))
    .make(binding).toString()
}

よし、これでパースできるようになった。早速使ってみよう。
今回はエルシャダイ風に使ってみました。

'''${user1}${serif1}
<%= user2 %>「<%= serif2 %>」
'''.parse(
  user1: 'ルシフェル', serif1: 'そんな装備で大丈夫か?',
  user2: 'イーノック', serif2: '大丈夫だ、問題ない'
)

${...} と <% ... %>, <%= ... %> どちらでも行けます。ただ文字列はシングルクォートの方を使うことに注意。

さて、結果の文字列は以下のような感じに。


ルシフェルそんな装備で大丈夫か?
イーノック「大丈夫だ、問題ない」