ついに奴ら(花粉)が今年も活動を開始したみたいですね。日に日につらくなってきました。
さて、諸所の事情によりエディタ探しの旅が一周回ってVimに戻ってきました。以前、PythonでVim用の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があるといいですね。
辞書ファイル
作成した辞書ファイルはこちらです。
コード一式はこちらから取得できます。
余談
ここのところClojureやHaxeの勉強をしているのですが、マイナーな言語になるにつれAtomエディタだと十分な拡張パッケージがなかったり、カスタマイズが難しかったりすることが多くなり、結果、再びVimに戻ってきました。
キー操作はどのエディタでもいつもviモードなので、操作的にはそれほど違いはないのですが、踏み込んだ設定をする際に必ず先人がいるのは心強いですね。