No Programming, No Life

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

MarkupBuilderでHTML生成を試してみた

仕事でちょっとしたアンケートを集計しなきゃいけなくなった。
結果のレポートをHTMLで出力しといたら気が利くかな〜と考えてて、そんな時こそGroovyのMarkupBuilderだろ!って思ったので早速テスト。
(動作確認: Groovy Version: 1.7.2 JVM: 1.6.0_20)

import groovy.xml.MarkupBuilder

def writer = new File('/groovy_htmlbuilder_test.html').newPrintWriter('UTF-8')
def html = new MarkupBuilder(writer)
html.doubleQuotes = true // 属性は ' じゃなくて " で。
html.html {
   head {
      meta('http-equiv': 'Content-Type', content: 'text/html; charset=UTF-8')      title('MarkupBuilderでHTMLを生成')
      style(type:'text/css') {
         mkp.yieldUnescaped('''
            <!--
            body {
               color      : #000000;
               background : #E6DED9;
               font-size  : 200%;
            }
            //-->
         ''')
      }
   }
   body() {
      mkp.comment('''
         追記:2010-05-14
         バージョンが上がってyieldUnescapedやyieldや
         ここでも使っているcommentみたいなヘルパーメソッドは
         mkp. を付けることが必要になったみたいです。
      ''')
      mkp.yield('MarkupBuilderのテストです。'); br()
      a(href:'http://d.hatena.ne.jp/fumokmm/', 'No Programming, No Life'); br()
      a(href:'http://d.hatena.ne.jp/fumokmm/20090131/1233428513', 'MarkupBuilderでHTML生成を試してみた'); br()
      mkp.yield('↑当ブログはこちらからどうぞ'); br()
   }
}
writer.close()

生成されるHTML (groovy_htmlbuilder_test.html)

<html> 
  <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>MarkupBuilderでHTMLを生成</title> 
    <style type="text/css"> 
            <!--
            body {
               color      : #000000;
               background : #E6DED9;
               font-size  : 200%;
            }
            //-->
         </style> 
  </head> 
  <body><!-- 
         追記:2010-05-14
         バージョンが上がってyieldUnescapedやyieldや
         ここでも使っているcommentみたいなヘルパーメソッドは
         mkp. を付けることが必要になったみたいです。
       -->MarkupBuilderのテストです。
    <br /> 
    <a href="http://d.hatena.ne.jp/fumokmm/">No Programming, No Life</a> 
    <br /> 
    <a href="http://d.hatena.ne.jp/fumokmm/20090131/1233428513">MarkupBuilderでHTML生成を試してみた</a> 
    <br />↑当ブログはこちらからどうぞ
    <br /> 
  </body> 
</html>

いい感じに出来上がりました。

注意点

  • 上記スクリプトを実行すると、/groovy_htmlbuilder_test.htmlにhtmlファイルが生成されます。*1
  • 要素の属性はデフォルトだとシングルクォート(')になっちゃうみたいなので、doubleQuotes = trueでHTMLらしくダブルクォート(")になるようにしています。
  • みたいな子要素の前後にテキストノードがある場合は、mkp.yieldもしくはmkp.yieldUnescapedを使うとよいみたい。*2(下記参照)
p{
   mkp.yield('ここは文字です。→出力時エスケープ<&\'">')
   b('子要素')
   mkp.yieldUnescaped('<!-- ここはコメント -->')
   mkp.comment('これもコメント')
}
<p>
   ここは文字です。→出力時エスケープ<&'">
   <b>子要素</b>
   <!-- ここはコメント --><!-- これもコメント -->
</p>

追記(2010-05-14)

バージョンが上がってyieldUnescapedやyieldやcommentみたいなヘルパーメソッドはmkp.を付けることが必要になったみたいです。*3
こうすることで、クロージャ内からMarkupBuilderにアクセスできるようですね。
それに伴い、サンプルソースも修正しておきました。

追記(2010-10-21)

GroovyでBuilder系の定義ファイルの外出しする - No Programming, No Lifeにて定義ファイルを外出しする方法を書きました。

追記(2010-10-22)

サンプルにmetaタグを追加。(requested by here)
File#newPrintWriter(charset)を利用して文字コードを指定するよう修正しました。

*1:Windowsの場合はC:\groovy_htmlbuilder_test.html

*2:mkp.yieldだと < みたいなXML的にエスケープが必要な文字はエスケープされます。ただし、'や"はエスケープしてくれないみたい。mkp.yieldUnescapedはそういう文字もエスケープせずに出力してくれます。

*3:mkpは#getMkp()のエイリアスです。