-
Notifications
You must be signed in to change notification settings - Fork 3
/
google_suggestions.js
122 lines (101 loc) · 3.83 KB
/
google_suggestions.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
Copyright 2015 Ivan [email protected]
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
const Lang = imports.lang;
const Soup = imports.gi.Soup;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Utils = Me.imports.utils;
const PrefsKeys = Me.imports.prefs_keys;
var SUGGESTION_TYPE = {
QUERY: 'QUERY',
NAVIGATION: 'NAVIGATION',
CALCULATOR: 'CALCULATOR'
};
var GoogleSuggestions = new Lang.Class({
Name: 'GoogleSuggestions',
_init: function() {
// nothing
},
_build_url: function(query) {
let url = Utils.SETTINGS.get_string(PrefsKeys.GOOGLE_SUGGESTIONS_URL);
url = url.format(encodeURIComponent(query));
return url;
},
_parse_response: function(data) {
if(data[1].length < 1) return [];
let suggestions = [];
for(let i = 0; i < data[1].length; i++) {
let text = data[1][i].trim();
let type = data[4]['google:suggesttype'][i].trim();
let relevance = parseInt(
data[4]['google:suggestrelevance'][i]
);
let proceed = (
!Utils.is_blank(text) &&
!Utils.is_blank(type) &&
relevance > 0
);
if(!proceed) continue;
let suggestion = {
text: text,
type: type,
relevance: relevance
}
suggestions.push(suggestion);
}
return suggestions;
},
get_suggestions: function(query, types, limit, callback) {
if(Utils.is_blank(query)) {
callback(query, null, 'Query is empty.');
return;
}
let url = this._build_url(query);
let message = Soup.Message.new('GET', url);
Utils.HTTP_SESSION.queue_message(message,
Lang.bind(this, function(http_session, response) {
if(response.status_code !== Soup.KnownStatusCode.OK) {
let error_message =
'GoogleSuggestions:get_suggestions(): Error: code %s, reason %s'.format(
response.status_code,
response.reaseon_phrase
);
callback(query, null, error_message);
return;
}
let json;
try {
json = JSON.parse(response.response_body.data);
let suggestions = this._parse_response(json);
if(types !== null && types.length > 0) {
suggestions = suggestions.filter(
function(suggestion) {
return types.indexOf(suggestion.type) !== -1;
}
);
}
if(limit > 0) suggestions = suggestions.splice(0, limit);
callback(query, suggestions);
}
catch(e) {
let error_message = 'GoogleSuggestions:get_suggestions(): %s'.format(e);
callback(query, null, error_message);
}
})
);
},
destroy: function() {
// nothing
}
});