このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

groovyのmarkup/node builderと混合内容:実験

雑誌ネタにと、groovyをいじってみました(groovy-1.0-beta-9)。次のようなXHTMLインスタンスをMarkupBuilderで出力しましょう。

これは手書きのお手本:


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>hello</title>
</head>
<body style="color:blue">
<p>Hello, world.</p>
</body>
</html>

こんなgroovyコードで:


import groovy.xml.MarkupBuilder
import java.io.PrintWriter

xml = new MarkupBuilder(new PrintWriter(System.out))
xml.html(xmlns: "http://www.w3.org/1999/xhtml") {
head() {
title("hello")
}
body(style: "color:blue") {
p("Hello, world.")
}
}
println() // 単なる整形用

出力はこうなる:


<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<title>hello</title>
</head>
<body style='color:blue'>
<p>Hello, world.</p>
</body>
</html>

ここまではいいのだけど、要素pを混合内容mixed content; mixture)としたいときはどうするのだろう?

これは手書きのお手本:


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>hello</title>
</head>
<body style="color:blue">
<p>Hello,<br/> world.</p>
</body>
</html>

問題は、pのなかに入り込んだbrタグ。これでテキストが分割される。

たとえばこんなgroovyコードを書いてみると:


import groovy.xml.MarkupBuilder
import java.io.PrintWriter

xml = new MarkupBuilder(new PrintWriter(System.out))
xml.html(xmlns: "http://www.w3.org/1999/xhtml") {
head() {
title("hello")
}
body(style: "color:blue") {
p() {
"Hello,"
br()
"world."
}
}
}
println() // 単なる整形用

案の定、ダメだわな:


<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<title>hello</title>
</head>
<body style='color:blue'>
<p>
<br />
</p>
</body>
</html>

よくわからんが、エーイッ、こんなんはどうだ!:


import groovy.xml.MarkupBuilder
import java.io.PrintWriter

xml = new MarkupBuilder(new PrintWriter(System.out))
xml.html(xmlns: "http://www.w3.org/1999/xhtml") {
head() {
title("hello")
}
body(style: "color:blue") {
p() {
_("Hello,")
br()
_("world.")
}
}
}
println() // 単なる整形用

やっぱりダメか:


<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<title>hello</title>
</head>
<body style='color:blue'>
<p>
<>Hello,</>
<br />
<>world.</>
</p>
</body>
</html>

でも、これ、なんかオシイじゃん。

(続く)