インターネットへようこそ!!
引越しが終わってから1週間、ようやく光回線が開通しておれってばオンライン。
CSS のセレクタって頑張れば Ruby の DSL として書けそうかも? と思って、ちょっとせこせこ頑張っていた。
セレクタを表すオブジェクトを作って、HTML の要素名のファクトリメソッドを実装してあげて、演算子オーバーロードでセレクタ結合子も実装すれば、いいかんじ。 Ruby 1.9.1 からはハッシュのキーがシンボルだと margin:0, font_family:["Arial", :sans_serif]
のように書ける。すごく CSS ぽい…。
class CSSSelector module HTML %w( html body : : ).each do |i| define_method(i) { CSSSelector.new(i) } end end def initialize(ele) @element = ele end protected def ~(other) other end def >(other) other end def +(other) other end end
include CSSSelector::HTML li + li { margin:[0, :auto], list_style_type:nil, }
ブロック付きメソッド呼び出しのようで、単なるハッシュを引数としているだけ。例のコードでは適当な実装だけど、例えば、 @parents
という親要素の情報をもつ配列があったとして、 E > F
というセレクタでは F というシンプルセレクタの @parents
に E を追加する、という実装でもいいかもしれない。というか、その方が現実的だと思う。一様に self
を返すのは例とはいえ、あまりよくないなあ。
そもそも Sass とかいう DSL ぽいのがあるけど、インスコがめんどくさいのでいっそ DSL というより Ruby のオブジェクトにしてしまえばいいじゃない、という発想。誰が得するんだろう。でも、変に変数の記法とか考えなくていいし。ブロック付きメソッド呼び出しの可能性を考えると、もっとキモイことができそうでわくわくする。これだから Ruby はいいんだよなあ。