仕事でちょっとしたアンケートを集計しなきゃいけなくなった。
結果のレポートを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)を利用して文字コードを指定するよう修正しました。