インターネットへようこそ!!

インターネットへようこそ!!

引越しが終わってから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 というシンプルセレクタの @parentsE を追加する、という実装でもいいかもしれない。というか、その方が現実的だと思う。一様に self を返すのは例とはいえ、あまりよくないなあ。

そもそも Sass とかいう DSL ぽいのがあるけど、インスコがめんどくさいのでいっそ DSL というより Ruby のオブジェクトにしてしまえばいいじゃない、という発想。誰が得するんだろう。でも、変に変数の記法とか考えなくていいし。ブロック付きメソッド呼び出しの可能性を考えると、もっとキモイことができそうでわくわくする。これだから Ruby はいいんだよなあ。