1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2026-01-06 07:24:13 +01:00

First stab at bookmark keyword suggestions support.

This commit is contained in:
Kris Maglione
2011-11-02 22:25:43 -04:00
parent 02fca3e9bc
commit abef44ea98

View File

@@ -251,29 +251,49 @@ var Bookmarks = Module("bookmarks", {
getSuggestions: function getSuggestions(engineName, query, callback) { getSuggestions: function getSuggestions(engineName, query, callback) {
const responseType = "application/x-suggestions+json"; const responseType = "application/x-suggestions+json";
if (Set.has(this.suggestionProviders, engineName))
return this.suggestionProviders[engineName](query, callback);
let engine = Set.has(this.searchEngines, engineName) && this.searchEngines[engineName]; let engine = Set.has(this.searchEngines, engineName) && this.searchEngines[engineName];
if (engine && engine.supportsResponseType(responseType)) if (engine && engine.supportsResponseType(responseType))
var queryURI = engine.getSubmission(query, responseType).uri.spec; var queryURI = engine.getSubmission(query, responseType).uri.spec;
if (!queryURI) if (!queryURI)
return (callback || util.identity)([]); return (callback || util.identity)([]);
function parse(req) JSON.parse(req.responseText)[1].filter(isString);
return this.makeSuggestions(queryURI, parse, callback);
},
/**
* Given a query URL, response parser, and optionally a callback,
* fetch and parse search query results for {@link getSuggestions}.
*
* @param {string} url The URL to fetch.
* @param {function(XMLHttpRequest):[string]} parser The function which
* parses the response.
*/
makeSuggestions: function makeSuggestions(url, parser, callback) {
function process(req) { function process(req) {
let results = []; let results = [];
try { try {
results = JSON.parse(req.responseText)[1].filter(isString); results = parser(req);
}
catch (e) {
util.reportError(e);
} }
catch (e) {}
if (callback) if (callback)
return callback(results); return callback(results);
return results; return results;
} }
let req = util.httpGet(queryURI, callback && process); let req = util.httpGet(url, callback && process);
if (callback) if (callback)
return req; return req;
return process(req); return process(req);
}, },
suggestionProviders: {},
/** /**
* Returns an array containing a search URL and POST data for the * Returns an array containing a search URL and POST data for the
* given search string. If *useDefsearch* is true, the string is * given search string. If *useDefsearch* is true, the string is
@@ -670,15 +690,19 @@ var Bookmarks = Module("bookmarks", {
let engineList = (engineAliases || options["suggestengines"].join(",") || "google").split(","); let engineList = (engineAliases || options["suggestengines"].join(",") || "google").split(",");
engineList.forEach(function (name) { engineList.forEach(function (name) {
var desc = name;
let engine = bookmarks.searchEngines[name]; let engine = bookmarks.searchEngines[name];
if (!engine) if (engine)
var desc = engine.description;
else if (!Set.has(bookmarks.suggestionProviders, name))
return; return;
let [, word] = /^\s*(\S+)/.exec(context.filter) || []; let [, word] = /^\s*(\S+)/.exec(context.filter) || [];
if (!kludge && word == name) // FIXME: Check for matching keywords if (!kludge && word == name) // FIXME: Check for matching keywords
return; return;
let ctxt = context.fork(name, 0); let ctxt = context.fork(name, 0);
ctxt.title = [/*L*/engine.description + " Suggestions"]; ctxt.title = [/*L*/desc + " Suggestions"];
ctxt.keys = { text: util.identity, description: function () "" }; ctxt.keys = { text: util.identity, description: function () "" };
ctxt.compare = CompletionContext.Sort.unsorted; ctxt.compare = CompletionContext.Sort.unsorted;
ctxt.filterFunc = null; ctxt.filterFunc = null;