#:g1: closure-htmlの紹介

Posted 2014-09-25 10:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の268日目です。

closure-htmlとはなにか

 closure-htmlは、Gilbert Baumann氏作のHTMLをパーズしてLHTML等に変換したり、LHTMLをHTMLにシリアライズしたりするライブラリです。

パッケージ情報

パッケージ名closure-html
Quicklisp
CLiKiCLiki: closure-html
Quickdocsclosure-html | Quickdocs
common-lisp.netClosure HTML
CL Test Grid: ビルド状況closure-html | CL Test Grid

インストール方法

(ql:quickload :closure-html)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 closure-htmlは元々、Common Lisp製のブラウザのclosureの一部でしたが、closureは最近見掛けないので、一部だったことは既に忘れ去られているのではないでしょうか。
closureは5年位前まではビルドできた記憶があります。

 chtml:parseを利用して様々な形式に出力できますが、入力としては文字列とファイルが取れます。
変換先は なんとか-sinkや、なんとか-builderというのが用意されているので目的に応じて使い分けます。
closure-htmlに含まれているのは、

です。
他にもClosure系のライブラリで幾つか定義されているかなと思います(STP等)

(chtml:parse "<b>foo</b><foo>foo</foo>" (chtml:make-string-sink))
;=>  "<HTML><HEAD></HEAD><BODY><B>foo</B>foo</BODY></HTML>"

(chtml:parse "<b>foo</b><foo>foo</foo>" (chtml:make-pt-builder)) ;=> #<SGML:PT HTML ..>

(chtml:parse "<b>foo</b><foo>foo</foo>" (chtml:make-rod-sink)) ;=> "<HTML><HEAD></HEAD><BODY><B>foo</B>foo</BODY></HTML>"

(chtml:parse "<b>foo</b><foo>foo</foo>" (chtml:make-lhtml-builder)) ;=> (:HTML NIL (:HEAD NIL) (:BODY NIL (:B NIL "foo") "foo"))

(with-output-to-string (out) (chtml:parse "<b>foo</b><foo>foo</foo>" (chtml:make-character-stream-sink out))) ;=> "<HTML><HEAD></HEAD><BODY><B>foo</B>foo</BODY></HTML>"

(chtml:parse "<b>foo</b><foo>foo</foo>" (chtml:make-octet-vector-sink)) ;=> #(60 72 84 77 76 62 60 72 69 65 68 62 60 47 72 69 65 68 62 60 66 79 68 89 62 60 ; 66 62 102 111 111 60 47 66 62 102 111 111 60 47 66 79 68 89 62 60 47 72 84 77 ; 76 62)

RODと、PTってなんだろうという感じですが、RODは、Unicodeの文字列のことで、PTは、HAXというSAXのようなAPIで利用するデータ構造のようです。
PTを扱うツールも色々あるようです。

(sgml:ppt (chtml:parse "<b>foo</b><foo>foo</foo>" (chtml:make-pt-builder)))
;>>  
;>>  | HTML
;>>  `-----.
;>>        | HEAD
;>>        | BODY
;>>        `-----.
;>>              | B
;>>              +--.
;>>              |  | "foo" 
;>>              | "foo" 
;=>  ""

ちなみに、Runeというものも見掛けるのですが、Unicodeの文字のことで、RuneのベクタがRODということみたいです。
一応RuneとRodについてはドキュメントがあるようなので紹介しておきます。

 PTや、LHTMLからのHTMLへのシリアライズは、serialize-lhtmlや、serialize-ptを利用します。

(chtml:serialize-lhtml (chtml:parse "<b>foo</b><foo>foo</foo>" (chtml:make-lhtml-builder))
                       (chtml:make-string-sink))
;=>  "<HTML><HEAD></HEAD><BODY><B>foo</B>foo</BODY></HTML>"

まとめ

 今回は、closure-htmlを紹介してみました。
Closure関係のものには独自の用語が多いのですが、解説はあまりありません…。

comments powered by Disqus