Chienomi

PureDocにYAMLメタデータ機能を追加

これまで仕様としても定義されてこなかった@metaの使い方だが、この度実装された。

文書中の最初にある##--ではじまる行と次にくる##--ではさまれた行が、# (スペース込み)をstripしてYAMLとして解釈され、それが@metaに格納される。

1つのスペースを削除して解釈するのはYAMLにおいてスペースが意味をもつからだ。他のマクロやRubyのmagic commentにひっかからないように使用を決定したつもりだが、異論があれば修正するつもりだ。既にPureDocのリポジトリをアップデートしてある。

例えばこの文書では

##--*--*--*--*--*--*--*--## # title : PureDocにYAMLメタデータ機能を追加 # since : 2014-09-01 15@29:00 +09:00 # tags: [devel, programming, ruby, utility] ##--*--*--*--*--*--*--*--##

というメタデータを書いてある。もちろん、仕様自体がこのような見た目のよいコメントブロックを書きやすいように考慮したものだ。

このためのコードは

# Process META DATA # META DATA is start and end line beginning ##--. # Lines between them is proceed as YAML after strip beginning "# " . docstr = ARGF.read # Content begin if docstr =~ /^##--.*$/ $' =~ /^##--.*$/ yax = $`.each_line.map {|i| i.sub(/^# /, "") }.join DOC.meta = YAML.load(yax) || Hash.new end rescue DOC.meta = {} end

正規表現でマッチ位置を決めて、そこから後ろでさらにマッチを探し、そしてその前、という形で「中身」を取りだし、行のEnumerableにしてからstripしている。失敗は例外任せ。

@metaをどう使うかは規定がないが、基本的には文書中で参照するためにある。また、PureDoc自体をparseしないプログラムからでもメタデータだけを読みたい要望があるかもしれないので、メタデータは#isの中ではなくここで定義することが望ましい。