diff options
author | Shin'ya Ueoka <ueokande@i-beam.org> | 2017-09-18 22:06:17 +0900 |
---|---|---|
committer | Shin'ya Ueoka <ueokande@i-beam.org> | 2017-09-18 22:06:17 +0900 |
commit | 2c079b0e011e343f120ae502a37aebdc4f80b534 (patch) | |
tree | b49d9f0906bc93a1b121c8fbd58f6be6a0a63e61 | |
parent | 8a8222158cd2b2d2277b3cc956ad97517e64c65d (diff) | |
parent | 14a60c67b9f35d5f104403ed03da429588f452ca (diff) |
Merge branch 'open-or-search'
-rw-r--r-- | README.md | 3 | ||||
-rw-r--r-- | src/actions/command.js | 82 |
2 files changed, 65 insertions, 20 deletions
@@ -20,7 +20,7 @@ Firefox by WebExtensions API. - [ ] open command - [x] open a link - - [ ] search by keywords with engined + - [x] search by keywords with engined - [x] complete URLs from history - [ ] complete keywords for search - [x] tabs navigation @@ -47,6 +47,7 @@ Firefox by WebExtensions API. - [x] activate input form - [ ] misc - [ ] configurable keymaps + - [ ] search engine settings - [ ] .rc file - [ ] other commands in Ex mode - [ ] supporting Google Chrome/Chromium diff --git a/src/actions/command.js b/src/actions/command.js index 3e879a6..93c06b8 100644 --- a/src/actions/command.js +++ b/src/actions/command.js @@ -2,11 +2,36 @@ import * as tabs from '../background/tabs'; import * as histories from '../background/histories'; import * as consoleActions from './console'; -const normalizeUrl = (string) => { +const DEFAULT_SEARCH_ENGINES = { + default: 'google', + engines: { + 'google': 'https://google.com/search?q={}', + 'yahoo': 'https://search.yahoo.com/search?p={}', + 'bing': 'https://www.bing.com/search?q={}', + 'duckduckgo': 'https://duckduckgo.com/?q={}', + 'twitter': 'https://twitter.com/search?q={}', + 'wikipedia': 'https://en.wikipedia.org/w/index.php?search={}' + } +}; + +const normalizeUrl = (string, searchConfig) => { try { return new URL(string).href; } catch (e) { - return 'http://' + string; + if (string.includes('.') && !string.includes(' ')) { + return 'http://' + string; + } + let query = encodeURI(string); + let template = searchConfig.engines[ + searchConfig.default + ]; + for (let key in searchConfig.engines) { + if (string.startsWith(key + ' ')) { + query = encodeURI(string.replace(key + ' ', '')); + template = searchConfig.engines[key]; + } + } + return template.replace('{}', query); } }; @@ -38,15 +63,48 @@ const bufferCommand = (keywords) => { }); }; +const getOpenCompletions = (keywords) => { + return histories.getCompletions(keywords).then((pages) => { + let historyItems = pages.map((page) => { + return { + caption: page.title, + content: page.url, + url: page.url + }; + }); + let engineNames = Object.keys(DEFAULT_SEARCH_ENGINES.engines); + let engineItems = engineNames.filter(name => name.startsWith(keywords)) + .map(name => ({ + caption: name, + content: name + })); + + let completions = []; + if (engineItems.length > 0) { + completions.push({ + name: 'Search Engines', + items: engineItems + }); + } + if (historyItems.length > 0) { + completions.push({ + name: 'History', + items: historyItems + }); + } + return completions; + }); +}; + const doCommand = (name, remaining) => { switch (name) { case 'o': case 'open': // TODO use search engined and pass keywords to them - return openCommand(normalizeUrl(remaining)); + return openCommand(normalizeUrl(remaining, DEFAULT_SEARCH_ENGINES)); case 't': case 'tabopen': - return tabopenCommand(normalizeUrl(remaining)); + return tabopenCommand(normalizeUrl(remaining, DEFAULT_SEARCH_ENGINES)); case 'b': case 'buffer': return bufferCommand(remaining); @@ -60,21 +118,7 @@ const getCompletions = (command, keywords) => { case 'open': case 't': case 'tabopen': - return histories.getCompletions(keywords).then((pages) => { - let items = pages.map((page) => { - return { - caption: page.title, - content: page.url, - url: page.url - }; - }); - return [ - { - name: 'History', - items - } - ]; - }); + return getOpenCompletions(keywords); case 'b': case 'buffer': return tabs.getCompletions(keywords).then((gotTabs) => { |