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