hotchpotch (owner)

Revisions

gist: 60363 Download_button fork
public
Public Clone URL: git://gist.github.com/60363.git
Embed All Files: show embed
google-search.js #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
(function() {
 
var p = function (arg) {
    Application.console.log(arg);
    // liberator.log(arg);
}
 
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;
}
 
commands.addUserCommand(['google'],
    'Google Search, 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];
 
            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(context.filter);
            xhr.open('GET', reqURL, false);
            xhr.send(null);
 
            var div = window.content.document.createElement('div');
            div.innerHTML = xhr.responseText;
 
            var elements = $X('//div/ol/li/h3/a', div);
            var regex = new RegExp('/url\\?q=([^&]+)');
            context.completions = elements.map(function(e) {
                if (e.href.match(regex)) {
                    // for moshikasite?
                    return [decodeURIComponent(RegExp.$1), e.textContent];
                } else {
                    return [e.href, e.textContent];
                }
            });
        },
        argCount: '1',
        bang: true,
    },
    true
);
 
})();