TinyMCEを解読する会(昨日くらいに一人で発足)

先日、TinyMCEを発見してから、電車に乗っている間なんかにちびちびと解読しております。しかし、ソースの量が結構やばいので、全体を概観するために、クラスとメソッドの一覧をソースから抜き出すスクリプトを書きました。一貫したスタイルでオブジェクトが定義されていたので、ものすごく抽出しやすかった。作者さんアリガチョ。
必要な作業は

  • function HOGEHOGE() {...};で定義されているクラス名HOGEHOGEを抜き出して
  • HOGEHOGE.prototype.fugafuga = function(...) {...};で定義されているメソッドを抜き出す

これを配列にぶち込んで、文字列にまとめてファイルに出力するだけ。
大変汚いソースコードですが、こんなんになりました。


s = File.open("./tiny_mce_src.js")

source = []Array[].new

s.[]each[]{|line|
  source.push(line)
}

s.close

classes = []Array[].new
methods = {}

source.[]each[]{|line|
  pt = Regexp.compile('^function\s(\w+)')
  []if[] pt =~ line []then[]
    m = line.match(pt)
    classes.push(m[1])
    methods[m[1]] = []Array[].new
  []end[]
}


classes.[]each[]{|c|
  ln = 0
  source.[]each[]{|line|
    ln += 1
    pt = Regexp.compile(c + '.prototype.(\w+)\s*=\s*function(\([\w,\s]*\))')
    []if[] pt =~ line []then[]
      m = line.match(pt)
      methods[c].push(m[1]+m[2]+':defined at ' + ln.to_s)
    []end[]
  }
}

buf = '';

classes.[]each[]{|c|
  buf += c + ":\n"
  methods[c]=methods[c].sort
  methods[c].[]each[]{|m|
    buf += '    ' + m + "\n"
  }
}

f = File.open('./classtable.txt','w')
f.puts buf
f.close

これで幸せな解読ライフに一歩近づきましたよ。うしし。

しかし、javascriptの文法を自分が全然知らないということを知らなかった19の冬。昔Javascriptやったことあるから特に勉強しなくても読めるだろう、と高をくくっていたら、意味不明な表現がいっぱい出てきたので、たまらずリファレンスにとびつきましたよ。Object.prototype = function(...)で動的にオブジェクトのメソッドを定義とかはじめて知りました(゜д゜)。Ajaxとか騒ぐ資格無いですねorz