YSLの仕様を考える1
http://d.hatena.ne.jp/shinichiro_h/20040814#p1
朝shinichiro.hさんのYAMPを見て、これでYAMLをHTMLにするようなコードが書けないかなあ…とか考えたのがはじまりで、YSLの仕様を練ってみます。
XSLTなんて使った事どころか見たことすら無いのですが。
で、YSLなんて名前使っていいのか、って事ですが、見つかりませんので(google:YSL YAML)いいということにしておきます。
要件としましては、次のふたつがあります。
XSLに対応させるのなら前者だけなのですが…前者だけできても正直要らねーです(^^;
で、仕様を考えるのですが、朝から考えてたものでだいたいまとまってます。
- A - B - C - D: E
仮にこんなYAMLがあったとしまして、
ysl-head: <HTML><HEAD></HEAD><BODY> ysl-list: ysl-head: <OL> ysl-item: - <LI> - ysl-head: + ysl-scalar: @ysl-value: ysl-hash: ysl-head: ++ D: - <B> - @ysl-key: - </B> - @ysl-value: ysl-item: @ysl-warning: - </LI> ysl-foot: </OL> ysl-foot: <BODY></HTML>
こういうのを通すと、次のように。
<HTML><HEAD></HEAD><BODY> <OL> <LI> + A </LI> <LI> + B </LI> <LI> + C </LI> <LI> + ++ <B> D </B> E </LI> </OL> <BODY></HTML>
条件と、コマンドに分かれてまして、コマンドはYAMPが書けるということにしておきます。
条件
- ysl-head: 最初に呼ばれる
- ysl-foot: 最後に呼ばれる
- ysl-list: リストにマッチ
- ysl-hash: ハッシュにマッチ
- (任意): ハッシュキーにマッチ
- ysl-item: リスト項目にマッチ、またハッシュキーのデフォルトケース
- ysl-scalar: 値にマッチ
コマンド
- @ysl-key: 処理中の項目のキー(を出力)
- @ysl-value: 処理中の項目の値(を出力)
- @ysl-warning: 警告をエラー出力
- @ysl-error: エラー出力してそこで処理を中止
- @if:とか、YAMPのコマンド
- (スカラー) その文字列を出力
コマンドが書けるところにはコマンドのリストも書けて、要素のコマンドが順番に処理されます。
おまけ
プロセッサにYSLが明示的に渡されなかった時のデフォルト処理として、YAMLファイルの最後尾にでも"ysl-*:"(ex. "ysl-html:")みたいな項目があれば、YSLプロセッサはデフォルトでそれを使う、とかしておくと埋めこめて便利かなあ?
じゃなければ.yamlまたは.ymlと同じファイル名で拡張子.yslを探すという方向で。
うーむ、これだけですと、HTMLは吐けてもYAMLは吐けないなあ…「インデントする」みたいなコマンドも要りますね…まあその辺は適座追加します。最初の目的はHTML。
「YSLの仕様を考える2」以降があるかどうかはコメント次第ということにして*1、不備が無いようでしたら実装にかかります。これまた、bogoYAMLを用いるか私のdyayamlを用いるかで少し悩んでるのですが。dyayamlは現在ストリーム読みだけでbogoYAMLのYamlHolderに相当するものがありませんので、新たに書くのが面倒。bogoYAMLは確か"-Key:Value"と一行で書けなかったはずですので、表記が冗長になってしまうのではないかと。
*1:反応がなければ…存在意義から考え直そう