YSLの仕様を考える1

http://d.hatena.ne.jp/shinichiro_h/20040814#p1

朝shinichiro.hさんのYAMPを見て、これでYAMLをHTMLにするようなコードが書けないかなあ…とか考えたのがはじまりで、YSLの仕様を練ってみます。
XSLTなんて使った事どころか見たことすら無いのですが。

で、YSLなんて名前使っていいのか、って事ですが、見つかりませんので(google:YSL YAML)いいということにしておきます。

要件としましては、次のふたつがあります。

  1. YAMLYAMLにできる
  2. YAMLXHTMLなどの非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:反応がなければ…存在意義から考え直そう