あと味

たくさん情報を食べて、たくさん発信すると、あとになって味わい深い。

S式から(X|HT)MLに変換する簡易的なコマンドラインツール作った

Lispの仏様と言われた竹内郁雄先生は、XML分厚いカッコのあるLispとおっしゃっているそうです。

実際に、S式で(HT|X)MLを書くと、自然でシンプルに書けるので、S式を(HT|X)MLに変換する単純なコンバータを作りました。

作ったもの

Buakko - Simple s−expression to (X|HT)ML converter.

ネーミングのBuakkoは「分厚いカッコ」をもじりました。

シンプルなコンバータです。むしろ、現時点ではいろいろ機能が足りない感じです。

S式といっても、データの表記方法の一つとして採用しているだけで、Lispとの関連性は強くはありません。演算機能もありませんし。

ツールはPerlで書かれています。

動かすのに必要なもの

  • Perl 5.8以上
  • CPANモジュール
    • Parse::RecDescent
    • Path::Class

また、インストールにはcpanmが必要です。

使い方

インストールするとbuakkoというコマンドラインツールがインストールされるので、それを使います。

$ buakko sample > sample.html

これで、sampleというS式で記述したHTMLファイルを、sample.htmlというHTMLに変換します。

リダイレクトしなければ、標準出力にプリントされます。

以下の様なS式形式のファイルを

(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."))))

以下のようなHTMLファイルに変換します。

<!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>

その他、細かい仕様とかインストール方法は、下記のREADMEをご覧ください。

README.md

作った動機

hiccupをとても気に入っていて、Clojureを利用する時には、これを利用すればよいのですが、Clojureを使わなくても気軽にS式をHTMLに変換できるツールがあるといいなぁと思っていました。

何かのモジュールで出来ればよかったんですけど、なかなかズバリなものがなかったので、パーサ部分から書くことにしました。

Perlで作った理由は、Movable Typeで利用したいと思っているからです。これでテンプレートを書けるようにしたい。

このコンバータには、演算機能がありませんが、Movable Typeには、MTVarやら、MTIFやら、MTForやらいろいろあるので、これくらいの機能でも充分かなと思います。

汎用性はすごく低いので、必要に応じてバージョンアップできたらいいですね。

気づいたこと

パーサを書かないといけないというのはわかっていたものの、自分のレベルでは、正規表現でパーサ書くのは厳しいと思ったので、いろいろ調べてみると、Parse::RecDescentという超便利なツールを見つけました。

このツールを作る大半が、Parse::RecDescentの使い方を調べる時間になった気がしますが、これを使えば、Perlで使うちょっとしたミニ言語が作れそうです。

それでも正しく書けているのかどうかよくわからないし、それ以前にコンパイラ周りのこと、全然知らないので、このツールに頼らなくても、ミニ言語が作れるようになりたいですね。

他に、野良モジュールをインストールしてもらう方法とか全然知らなかったので、いろいろ苦戦しました。

まとめ

S式とは言いつつも、ただ、記法を利用しただけなので、別にLispができるできないは関係なく使ってくれる人がいるといいなぁと思います。S式もDOMも、同じく木ですし、S式はそんなに難しいものではないです。

とりあえず、タイプ数は減るし、zen-coding感覚で使ってもらえれば良いかと。

そのままLispに目覚めても良いと思いますよ; )

時間のある時に、Movable Typeのプラグインとして利用できるようと思います。