読者です 読者をやめる 読者になる 読者になる

VimでCocos2d-JSのコードを補完する

Cocos2d-x Cocos2d-JS Vim

仕事がせわしなく、ざっと一月半更新が空いてしまいました…。

ここのところ必要に迫られて各種アプリフレームワークを調査しているのですが、いろいろ見ている中でもCocos2d-xは完成度が高く、オープンソースでもあるため本命感がただよっています。しかし例によってVimで補完が効かないため、コードを書くのがちょっと面倒です。

ということで、Vimの補完用にCocos2d-xのキーワード辞書を作ってみることにします。さしあたってはJavaScriptで手軽に実装するつもりなので、Cocos2d-xのJavaScript版であるCocos2d-JS向けの辞書を作成します。

Cocos2d-JSのキーワード抽出方法

Cocos2d-JSのキーワードは、最新版であるv3.6のAPIリファレンスページから抽出することにします。

具体的には、PythonAPIリファレンスのHTMLをダウンロードし、左側のクラス一覧からクラス名と各クラスのページへのリンクを、各クラスのページからそれぞれのメンバ名を抜き出します。

キーワード抽出スクリプト

それほど難しいことはしていないので、いきなりスクリプト全文です。

SYMBOL_PATTERNMEMBER_PATTERNの2種類の正規表現でそれぞれクラス名とメンバ名を検索しています。

import urllib.request
import re


BASE_URL = 'http://www.cocos2d-x.org/reference/html5-js/V3.6/'
INDEX_URL = BASE_URL + 'index.html'
SYMBOL_URL = BASE_URL + 'symbols/{0}.html'

SYMBOL_PATTERN = r'href="symbols/(.*?)\.html"'
MEMBER_PATTERN = r'id="(.*?)"'

PREFIXES = ['.', 'cc.', 'ccs.', 'ccui.', 'jsb.', 'sp.']
EXCLUSIONS = ['MethodsList', 'MethodsListInherited', 'constructor', 'MethodDetail']

FILENAME = 'cocos2d-js.dict'


def download_html(url):
  response = urllib.request.urlopen(url)
  html = response.read()
  return html.decode()


def get_symbols():
  html = download_html(INDEX_URL)
  symbols = re.findall(SYMBOL_PATTERN, html)
  return symbols


def get_members(symbol):
  html = download_html(SYMBOL_URL.format(symbol))
  members = re.findall(MEMBER_PATTERN, html)
  return members


def trim_keyword(keyword):
  for prefix in PREFIXES:
    if keyword.startswith(prefix):
      return keyword[len(prefix):]

  return keyword


def get_keywords():
  keywords = set()
  symbols = get_symbols()

  for symbol in symbols:
    print('analyze:', symbol)
    keywords.add(trim_keyword(symbol))

    members = get_members(symbol)
    for member in members:
      keywords.add(trim_keyword(member))

  for exclusion in EXCLUSIONS:
    if exclusion in keywords:
      keywords.remove(exclusion)

  keywords = list(keywords)
  keywords.sort()

  return keywords


def write_keywords():
  keywords = get_keywords()

  with open(FILENAME, 'w') as file:
    for keyword in keywords:
      file.write(keyword)
      file.write('\n')


if __name__ == '__main__':
  write_keywords()

余談ですが初めてPython3を使いました。まだ慣れないな。

Cocos2d-JS辞書ファイル

実際に作成した辞書ファイルはこちらに置いておきました。

(追記:その後Ruby版に切り替えたため、そちらへのリンクに変更しました) github.com

後はVimの補完設定に合わせて辞書ファイルを登録すれば作業完了です。

f:id:tkitao:20150716221117p:plain

開発の準備ができたので、早速Cocos2d-JSを使ってみようと思います。