Ruby で CSS をパースする

先日、motion-fontawesome を FontAwesome 4.0.3 に対応させたときの話。

利用できるアイコンを Hash で定義する箇所があり、 手入力でやるには数が多すぎる上に、さしみたんぽぽ作業。

なので、FontAwesome の CSS をもとに Hash を組み立てる Ruby スクリプト書いて一気にやった。 CSS のパースには css_parser っていう gem を使用している。

# coding: utf-8
require "css_parser"
include CssParser

parser = CssParser::Parser.new
parser.load_file!("font-awesome.css")

puts "{"
# すべてのセレクタを列挙
parser.each_selector do |selector, declarations, specificity|
  if selector.start_with?(".fa-") and selector.end_with?(":before")
    # アイコンの名前を取り出す
    selector[/¥.fa-([a-z0-9¥-]+):before/]
    icon_name = $‾[1]

    # content 属性の値を取り出す
    declarations[/content: "¥¥([a-z0-9]+)"/]
    icon_value = "0x#{$‾[1]}"

    # ハッシュ形式で出力
    puts "  ¥"#{icon_name}¥" => #{icon_value},"
  end
end
puts "}"

css_parser はセレクタの中身を文字列で渡してくるため、使い勝手があまりよろしくない。 Hash に変換してくれたら使いやすいんだけどな。