CGIプログラムなど、HTMLを生成したい場合がしばしばあります。
文字列として書くことがまず考えられますが、他のスクリプト言語と異なりGaucheにはヒアドキュメントがないのでこの方法はやや煩雑です。
例:
gosh> (print "<tr><td>日</td><td>月</td><td>火</td></tr>")
<tr><td>日</td><td>月</td><td>火</td></tr>
#<undef>
Gaucheには手軽にHTMLを生成するためのtext.html-liteライブラリが用意されています。text.html-liteライブラリを使うと、上記の例のHTMLは次の通りに書けます。
(html:tr (html:td "日") (html:td "月") (html:td "火"))
または(list "日" "月" "火")というリストがあったとき、map手続きを使って次の通りにも書けます。
(html:tr (map html:td (list "日" "月" "火"))) ;; html:tdをmapでリストに適用
text.html-liteライブラリで使用できる要素名
一般的にtext.html-liteライブラリでは、
html:要素名
の書式でHTML要素を記述します。
text.html-liteライブラリで使える要素名は、現時点ではHTML 4.01 DTD http://www.w3.org/TR/html4/sgml/dtd.html で定義されている要素です。
text.html-liteライブラリで記述した“HTML要素のリスト構造”をひとつの文字列に変換する
text.html-liteライブラリで構築したHTMLは要素のリストです。リストとして扱うのではなく一つの文字列に変換するにはtext.treeライブラリのtree->string手続きを使う必要があります。
例:
gosh> (html:tr (map html:tr (list "日" "月" "火")))
(#0="<" tr () #1=">" (((#0# tr () #1# ("日") #2="</" tr #3="\n>") (#0# tr () #1# ("月") #2# tr #3#) (#0# tr () #1# ("火") #2# tr #3#))) #2# tr #3#)
gosh> (use text.tree)
#<undef>
gosh> (tree->string (html:tr (map html:td (list "日" "月" "火"))))
"<tr><td>日</td\n><td>月</td\n><td>火</td\n></tr\n>"
文字列に変換するだけではなく現在の出力ポートに出力するにはtext.treeライブラリのwrite-tree手続きを使います。
例:
gosh> (write-tree (html:tr (map html:td (list "日" "月" "火"))))
<tr><td>日</td
><td>月</td
><td>火</td
></tr
>#t