S式 -> (HT|X)MLコンバータ
Lispの仏様と言われた竹内郁雄先生は、XMLを分厚いカッコのあるLispとおっしゃっているそうです。
実際に、S式で(HT|X)MLを書くと、自然でシンプルに書けるので、S式を(HT|X)MLに変換する単純なコンバータを作りました。
ネーミングのBuakkoは「分厚いカッコ」をもじりました。
hiccupが非常に便利なのですが、なかなかClojureを使える機会というのは少なく、いつでもhiccupのような仕組みを使いたいというのが作った動機の一つです。
非常に簡単な仕組みで作られているので、うるさくないかわりに、随分緩いです。
$ buakko hoge > hoge.html
(html (@lang "ja")
(head # ヘッダ
(meta (@charset "utf-8"))
(title "EXAMPLE"))
(body (@class "example home") # ボディ
(h1 "example!")
(p
(a (@href "http://example.com/" @target "_blank") "example web site."))))
<!doctype html><html lang="ja"><head><!--ヘッダ--><meta charset="utf-8" /><title>EXAMPLE</title></head><body class="example home"><!--ボディ--><h1>example!</h1><p><a href="http://example.com/" target="_blank">example web site.</a></p></body></html>
CPANに置いていないので、cpanmでtarballからインストールします。
- 以下からtarballをダウンロードします。
- ダウンロード先のディレクトリに移動し、以下のコマンドを実行します。
$ cpanm ./Buakko-0.01.tar.gz
(element)
<element />
カッコの先頭は、常に要素名。
値がない場合は、開始タグの最後にスラッシュを入れて閉じます。
(element "value")
<element>value</element>
値はダブルクォーテーションで囲む必要があります。
(script "var name = \"taiju\"; alert(name);")
<script>var name = "taiju"; alert(name);</script>
(element "value1" " " "value2")
<element>value1 value2</element>
値は複数指定できます。
(element1
"value1"
(element2 "value2")
(element3
"value3"
(element3_5 "value3_5"))
(element4 "value4"))
<element1>value1<element2>value2</element2><element3>value3<element3_5>value3_5</element3_5></element3><element4>value4</element4></element1>
要素の入れ子ができます。
(element (@attr "hoge"))
<element attr="hoge" />
属性を指定できます。属性は必ずキーと値が対で必要です。キーには先頭に@
を付ける必要があります。
(element (@attr1 "hoge" @attr2 "fuga"))
<element attr1="hoge" attr2="fuga" />
属性も複数の値が指定できます。
(div (@id "header") # ヘッダー開始
(h1 "title")
(p "Hello!!") # ヘッダー終了
)
<div id="header"><!--ヘッダー開始--><h1>title</h1><p>Hello!!</p><!--ヘッダー終了--></div>
対応しているのは1行コメントのみです。#
から行末までコメントになります。
全体のカッコの外側に記述することはできませんので、上記のようにカッコの対応箇所を調整する必要がある場合もあります。
(xml (@version "1.0" @charset "utf-8")
(root
(node1 "node1")
(node2 "node2")))
<?xml version="1.0" charset="utf-8"?><root><node1>node1</node1><node2>node2</node2></root>
(html (@lang "ja")
(head
(meta (@charset "utf-8"))
(title "title"))
(body "hello"))
<!doctype html><html lang="ja"><head><meta charset="utf-8" /><title>title</title></head><body>hello</body></html>
html要素を使うと自動的にdoctypeが付与されます。
$ perldoc Buakko
Copyright (c) 2012, taiju. All rights reserved.
MIT License.