コンテキストメニューの一括検索をバージョンアップ

Macのコンテキストメニューこと右クリックメニューに、独自の検索機能を付けていた件(ブログ記事:Macの右クリックメニューに項目を追加する方法)です。

私は、この独自の検索機能を毎日使っています。英語のイデオムなどよく使われる(と思われる)フレーズを一気に複数のサイトで検索してくれるので、とっても便利です。

しかし、クォート記号が入ると検索できなかったのです。

“Don’t sweat”を検索すると、Safariのタブに「名称未設定」と出てしまい、検索サイトが表示されません。

前から気になっていたのですが、手を付けられず、メインマシンの変更を機に環境移行している時に、クォート記号が入っても検索できるように改造しました。こんなことをやっているから環境移行の作業量が膨れ上がってしまっているのですが…。そこはそれ、IT業界ではよくあることです。気にせずいきましょう。

一括検索機能の改造

改善方法

クォート記号が入ると検索できないことから、クォート記号が特別の意味に解釈されていると考えられます。そこで、これを解決するにはクォート記号を特殊な意味に解釈させない仕組みが必要になります。

一般的に、特殊な意味を持つ文字から特殊な意味を省きたい時は、特殊な文字の前にエスケープ文字を付けます。例えば、正規表現などでは、バックスラッシュ`\’を使います。”Don’t sweat”はこうなります。

Don\’t sweet

しかし、WEBの世界ではもっと便利な方法があります。URLエンコードといって特殊な記号として解釈されそうな文字列をまとめて、「これらは全部データの文字で特別な意味はありませんよ!」と暗号化する方法があるのです。

参考サイト:プログラムテクニックメモ

URLエンコードとは
画面フォーム間でのデータ送信は、POST か GET の形式にて通常行いますが、このデータ送信の際に困るのが、データ項目名とデータとの切り分けなのです。実際なにが困るのかと言うと、データの区切り文字とデータ中に区切り文字が発生した場合が困るのです。 「xyz=aaaa」という場合は、xyz項目名は aaaa というデータです。となるのですが、「xyz=x=a」と記述された場合は、xyz項目名は x=a と解釈できないからです。この問題を解決するためにURLエンコードという手法を使い、データ部を特殊文字に置き換える事によって解決します。「xyz=%82%A1%AB%62」とかという文字列を見たことありませんか?  それがURLエンコードされた文字なのです。
URLエンコード方法
半角の[0-9]、[a-z]、[A-Z]、[*-.@_]は、そのまま記述([]は、関係ないです)し、半角スペースは 「+」で置き換え、日本語等の8bit文字は、漢字コードの上位・下位に「%」を付け変換します。例えば漢字コード “あ” は 0xA4A2 ですので %A4%A2 となります。

 URLエンコードは、WEBの世界の標準的な仕組みなので、URLエンコードされた暗号文字列は、Safariをはじめ全てのブラウザが解釈できて元の文字列を取り出すことができます。

そこで、今回は、検索したい文字列をURLエンコードしてから検索キーワードとして検索ページを開くことにします。

AppleスクリプトのURLエンコード

ネットで調べてみると、AppleスクリプトにはURLエンコードを行う関数が存在しないようです。しかし、Appleサポートの掲示板でURLエンコードのやり方を貼付けてくれている人がいました。

■ Apple サポート掲示板:URLencode in AppleScript

do shell script "/usr/bin/python -c 'import sys, urllib; print urllib.quote(sys.argv[1])' " & quoted form of TheTextToEncode

Apple スクリプトからpythonを呼び出してpythonでurlエンコードするようです。

やはり、海外ではpythonが一般的なんですね。この掲示板のスレッドにはPHPのコードを貼付けてくれている人もいたのですが、私の環境ではうまく動作しませんでした。

一括検索改善版

URLエンコードする仕組みを組み込んだ、英語のフレーズを複数のサイトで検索する一括検索機能のAppe スクリプトです。

set urlList to {"http://www.google.com/search?q=","http://www.google.com/search?as_st=y&tbm=isch&hl=en&as_epq=&as_oq=&as_eq=&cr=countryUS&as_sitesearch=&safe=images&orq=&tbs=ctr:countryUS,itp:clipart&biw=1067&bih=1142&sei=XKG4T6pepOKYBe32qcAJ&as_q=", "http://chiebukuro.search.yahoo.co.jp/search?flg=3&class=1&UTF-8=ei&fr=common-navi&dnum=2078297840&p=", "http://idioms.thefreedictionary.com/", "http://ejje.weblio.jp/content/"}
set clipboardString to (get the clipboard)
set encodedString to my URLencoding(clipboardString)
set numURLs to (count urlList)
open location (item 1 of urlList) & encodedString
tell application "Safari"
activate
tell window 1
repeat with i from 2 to (numURLs)
set current tab to (make new tab)
set URL of document 1 to (item i of urlList) & encodedString
end repeat
end tell
end tell
on URLencoding(input)
set quotedInput to quoted form of input
 set encodedString to do shell script "/usr/bin/python -c 'import sys, urllib; print urllib.quote(sys.argv[1])' " & quotedInput
 return encodedString
end URLencoding

このスクリプトでこんなサイトを検索します。

  • Google 一般検索
  • Goole 画像検索(U.S.のクリップアートを指定)
  • Yahoo!知恵袋の英語カテゴリで検索
  • The Free Dictionaryのidiom検索
  • Weblioの英和・和英検索

バージョンアップのついでにGoogle画像検索で画像も検索するようにしました。画像があったほうが理解しやすい場合もありますからね。

これでどんなフレーズでも検索できるようになりました。


関連記事