aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsecondlife2009-02-09 15:08:20 +0000
committersecondlife2009-02-09 15:08:20 +0000
commitbbb937da50f9e70b46038019fc0eeeb9016fbe8e (patch)
treeb75f8052f7bb6fe8cc5b97e37054a7ba98934440
parentc99e62719b276e2b7e336247583ea588207413fc (diff)
downloadvimperator-plugins-bbb937da50f9e70b46038019fc0eeeb9016fbe8e.tar.bz2
google 検索と補完
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@29799 d0d07461-0603-4401-acd4-de1884942a52
-rw-r--r--google-search.js86
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
+);
+
+})();