diff options
author | secondlife | 2009-02-09 15:08:20 +0000 |
---|---|---|
committer | secondlife | 2009-02-09 15:08:20 +0000 |
commit | bbb937da50f9e70b46038019fc0eeeb9016fbe8e (patch) | |
tree | b75f8052f7bb6fe8cc5b97e37054a7ba98934440 /google-search.js | |
parent | c99e62719b276e2b7e336247583ea588207413fc (diff) | |
download | vimperator-plugins-bbb937da50f9e70b46038019fc0eeeb9016fbe8e.tar.bz2 |
google 検索と補完
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@29799 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to 'google-search.js')
-rw-r--r-- | google-search.js | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/google-search.js b/google-search.js new file mode 100644 index 0000000..b84cf06 --- /dev/null +++ b/google-search.js @@ -0,0 +1,86 @@ +var PLUGIN_INFO = +<VimperatorPlugin> +<name>{NAME}</name> +<description>Google Search, and AutoComplete.</description> +<description lang="ja">Google 検索し、候補をよしなに補完します</description> +<minVersion>2.0</minVersion> +<maxVersion>2.0pre</maxVersion> +<updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/google-search.js</updateURL> +<author mail="hotchpotch@gmail.com" homepage="http://tako3.net/http://d.hatena.ne.jp/secondlife/">Yuichi Tateno</author> +<license>MPL 1.1/GPL 2.0/LGPL 2.1</license> +<version>0.1</version> +<detail><![CDATA[ +>|| +:gsearch[!] のと[tab] +||< + +google suggest での飛び先はあくまで google ですが、このプラグインは google の検索結果先に飛びます。 +この plugin を作ってから multi_requester.js の存在をしってあっちを使えば・・・、と思いました。いちおう favicon が表示されたりします。 +]]></detail> +</VimperatorPlugin>; + +(function() { + +var p = function (arg) { + Application.console.log(arg); + // liberator.log(arg); +} + +// Simple $X. os0x version +function $X (exp, context, resolver) { + context || (context = document); + var Doc = context.ownerDocument || context; + var result = Doc.evaluate(exp, context, resolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0, len = result.snapshotLength, res = []; i < len; i++) { + res.push(result.snapshotItem(i)); + } + return res; +} + +function getGoogleElements (word) { + var [lang] = Cc['@mozilla.org/network/protocol;1?name=http'] + .getService(Ci.nsIHttpProtocolHandler) + .language.split('-', 1); + var xhr = new XMLHttpRequest(); + var endpoint = 'http://www.google.co.jp/search'; + var reqURL = endpoint + '?hl=' + lang + '&q=' + encodeURIComponent(word); + xhr.open('GET', reqURL, false); + xhr.send(null); + + var div = window.content.document.createElement('div'); + div.innerHTML = xhr.responseText; + + return $X('//div/ol/li/h3/a', div); +} + +commands.addUserCommand(['gsearch'], + 'GoogleSearch, and AutoComplete', + function (args) { + var url = args.string; + if (url.indexOf('http') != 0) { + url = 'http://www.google.co.jp/search?q=' + encodeURIComponent(args.string); + } + liberator.open(url, args.bang? liberator.NEW_TAB : null); + }, { + completer: function (context) { + context.filters = [function() true]; + context.keys = {text: "url", description: "title", icon: "icon"}; + context.title = ['URL', 'TITLE']; + + var regex = new RegExp('/url\\?q=([^&]+)'); + context.completions = getGoogleElements(context.filter).map(function(e) { + var url = e.href.match(regex) ? decodeURIComponent(RegExp.$1) : e.href; + return { + url: url, + icon: bookmarks.getFavicon(url), + title: e.textContent + }; + }); + }, + argCount: '*', + bang: true, + }, + true +); + +})(); |