GroovyでHTMLを整形する…つもりだったけど

2019-02-13Groovy, 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が発生しています。うーーん・・・

2019-02-13Groovy, html