RubyでCocos2d-JSの辞書ファイルを作成する

ついに奴ら(花粉)が今年も活動を開始したみたいですね。日に日につらくなってきました。

さて、諸所の事情によりエディタ探しの旅が一周回ってVimに戻ってきました。以前PythonVim用のCocos2d-JSの辞書ファイルを作成したことがあったのですが、今回は周回記念ということで、Rubyで改めて最新版の辞書ファイルを作成してみたいと思います。

辞書作成コード

いきなりコード全文です。

require 'open-uri'
require 'nokogiri'

BASE_URL = 'http://www.cocos2d-x.org/docs/api-ref/js/v3x/'.freeze
FILENAME = 'cocos2d-js.dict'.freeze

URL_XPATH      = '//li/a/@href'.freeze
CLASS_XPATH    = '//caption[text()="Class Summary"]'.freeze
PROPERTY_XPATH = '//caption[text()="Field Summary"]'.freeze
METHOD_XPATH   = '//h2[text()="Method Summary"]'.freeze
COMMON_XPATH   = '..//td[@class="nameDescription"]'.freeze
NAME_XPATH     = './/div[@class="fixedFont"]/b/a/text()'.freeze

def parse_url
  puts "parse #{BASE_URL}"
  doc = Nokogiri::HTML(open(File.join(BASE_URL, 'index.html')))
  doc.xpath(URL_XPATH).map { |url| File.join(BASE_URL, url) }
end

def parse_page(url)
  puts "parse #{url}"
  doc = Nokogiri::HTML(open(url))
  [CLASS_XPATH, PROPERTY_XPATH, METHOD_XPATH].map do |xpath|
    parse_name(doc, File.join(xpath, COMMON_XPATH))
  end.flatten
end

def parse_name(doc, xpath)
  doc.xpath(xpath).map do |node|
    node.xpath(NAME_XPATH).to_s.strip.split('.').last
  end
end

def save_keywords(keywords)
  puts "write #{FILENAME}"
  path = File.join(File.dirname(__FILE__), FILENAME)
  open(path, 'w') { |f| f.puts keywords }
end

def make_keywords
  urls = parse_url
  keywords = urls.map { |url| parse_page(url) }.flatten.reject do |keyword|
    !keyword || keyword.include?(' ')
  end.uniq.sort
  save_keywords(keywords)
end

make_keywords

この手のスクレイピングのコードもだいぶ書き慣れてきました。

RuboCop先生のRubyコードチェックがどんどん厳しくなっていくおかげで、色んなRubyの一般常識を学んでいます。他の言語でもこれぐらい病的な充実したLinterがあるといいですね。

辞書ファイル

作成した辞書ファイルはこちらです。

コード一式はこちらから取得できます。

github.com

余談

ここのところClojureHaxeの勉強をしているのですが、マイナーな言語になるにつれAtomエディタだと十分な拡張パッケージがなかったり、カスタマイズが難しかったりすることが多くなり、結果、再びVimに戻ってきました。

キー操作はどのエディタでもいつもviモードなので、操作的にはそれほど違いはないのですが、踏み込んだ設定をする際に必ず先人がいるのは心強いですね。