2008/10/22

groovyでhtmlを整形する…つもりだったけど

仕事でユーザー様に提示するhtmlを作成中。

  • 入力不可にしてほしい
  • 色は緑に
  • もうすこし幅を・・・

などの要件を盛り込んでいるうちに、htmlがめちゃくちゃ汚くなってきた。(インデントはない、タグの属性は順序がばらばら。変更が積み重なるうちに、xmlに準拠してなくなってきている気も・・・)

ちょっとだけhtml整形スクリプト作ってみた。(正確にはxmlです。XmlSlurperを使っているので。)

def xmltext = '''
<records>
<car name='HSV Maloo' make='Holden' year='2006'>
<country>Australia</country>
<record type='speed'>Production Pickup Truck with speed of 271kph</record>
</car>
<car name='P50' make='Peel' year='1962'>
<country>Isle of Man</country>
<record type='size'>Smallest Street-Legal Car at 99cm wide and 59 kg in weight</record>
</car>
<car name='Royale' make='Bugatti' year='1931'>
<country>France</country>
<record type='price'>Most Valuable Car at $15 million</record>
</car>
</records>'''

def spaces = 4
output = { node, indent ->
def name = node.name()
def start = " "*indent + "<" +
([name] + node.attributes().collect{ "${it.key}=\"${it.value}\"" }.sort()).join(" ") + ">"

def children = node.children()
if( !children.isEmpty() ){
def center = children.collect{
output(it, indent+spaces)
}.join(" ")
def end = " "*indent + "</$name>"
return [start, center, end].join(" ")
} else {
def end = "</$name>"
return [start, node.text(), end].join("")
}

}

def records = new XmlSlurper().parseText(xmltext)

println output(records, 0)
  • 自動的にインデントづけ
  • タグの属性は、辞書順でソート(これは直した方がよかったかも)
  • 当然、xmlに準拠しない構造の場合にはエラー

面倒くさいけど、xmltextの変数部分にbodyをコピペして動かしていました。(ファイル全体を取り込むと、xmlのチェックに引っかかって動かない…)これで正常に動くかと思っていたのですが、正常に整形されるbodyとエラーで整形できないbodyが発生しています。うーーん・・・

0 件のコメント:

コメントを投稿