php.netの右上にある関数検索は、関数の名前が正確に思い出せずに間違った名前を入れてしまったときでも、入力された名前に似ている候補が表示されるようになっています。
自分はこのリファレンスを Firefoxの Quick Search を使って利用しています。 アドレスバーにphp get_file_contents と入力すると
http://jp2.php.net/manual-lookup.php?lang=ja&pattern=get_file_contentsに展開されて、リファレンスが見られるようにしています。こうしておくと base64_encode だったか base64encode だったか encode_base64 だったかわからない、というときも、一度検索すれば名前を知ることができます。ちなみに正解はbase64_encodeです。(PHPならvimの omnifunc completion をちゃんと使いこなせば問題解決なのですが、設定したきり存在をずっと忘れていました...)
この検索、名前があいまいでも探せて、レスポンスもよいのでphpだけでなくほかの言語にもあったらいいなと思っていました。そんなところに おぎろぐはてな - PHPマニュアルの検索 で php.net のコンテンツをrsyncでミラーできるのを教えてもらったので、さっそくどうなっているのか調べてみました。
あいまい検索を実現しているのは quickref.php の // Compute similarity of the name to the requested one
if (function_exists('similar_text') && !empty($notfound)) {
similar_text($funcname, $notfound, $p);
$temp[$entry] = $p;
}
の部分。PHPには similar_text という二つの文字列が似ている度合いを計算してくれる関数があるのをこのとき知りました。それもPHP4からあります。PHPは文字列の類似性判定をする関数が豊富で、このほかにも levenshtein, soundex, metaphone があるそうです。
候補の表示ロジックは安直で、検索された文字列とPHPの持っている全部の関数との類似性を算出して、類似性が高い順で並べる仕組みになっていました。文字列も長くて10バイト、関数もせいぜい数百しかないのでこのアプローチでも十分なレスポンスが出るのでしょう。
というわけで、php.netの関数検索のロジックをまねしてjavascriptのリファレンスを検索する javascript reference search をつくりました。リファレンスは mozilla developer center の Gecko DOM Reference と Core JavaScript 1.5 Reference を参照しています。
下の画像のように
http://labs.gmo.jp/projects/similar_search/lookup.php?pattern=%s に設定すれば、アドレスバーから js getelements と入れることで getelements を検索することができます。同じ名前の関数があるときは直接MDCのページか表示され、同じ名前のものがなければ似ている名前の一覧が表示されるようになっています。ちなみに php.net にあるオリジナルが、よくにているものは太字で表示されるようになっていたので、よく似ているものは太字で表示するようにしてあります。
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/123
comments