aboutsummaryrefslogtreecommitdiff
path: root/src/shared/commands.js
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2017-10-06 23:03:28 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2017-10-06 23:40:55 +0900
commit10ad62e60698c5d53ffcf58ae6abd182f7d3fc9c (patch)
treed1f4bd11917d9d7a47f5944b520b1e3a00778ee7 /src/shared/commands.js
parent32168a94e07478325a53779513533b76a6ef2c18 (diff)
console command actions without store
Diffstat (limited to 'src/shared/commands.js')
-rw-r--r--src/shared/commands.js143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/shared/commands.js b/src/shared/commands.js
new file mode 100644
index 0000000..b1d8780
--- /dev/null
+++ b/src/shared/commands.js
@@ -0,0 +1,143 @@
+import * as tabs from 'background/tabs';
+import * as histories from 'background/histories';
+
+const normalizeUrl = (string, searchConfig) => {
+ try {
+ return new URL(string).href;
+ } catch (e) {
+ 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);
+ }
+};
+
+const openCommand = (url) => {
+ return browser.tabs.query({
+ active: true, currentWindow: true
+ }).then((gotTabs) => {
+ if (gotTabs.length > 0) {
+ return browser.tabs.update(gotTabs[0].id, { url: url });
+ }
+ });
+};
+
+const tabopenCommand = (url) => {
+ return browser.tabs.create({ url: url });
+};
+
+const bufferCommand = (keywords) => {
+ return browser.tabs.query({
+ active: true, currentWindow: true
+ }).then((gotTabs) => {
+ if (gotTabs.length > 0) {
+ if (isNaN(keywords)) {
+ return tabs.selectByKeyword(gotTabs[0], keywords);
+ }
+ let index = parseInt(keywords, 10) - 1;
+ return tabs.selectAt(index);
+ }
+ });
+};
+
+const getOpenCompletions = (command, keywords, searchConfig) => {
+ return histories.getCompletions(keywords).then((pages) => {
+ let historyItems = pages.map((page) => {
+ return {
+ caption: page.title,
+ content: command + ' ' + page.url,
+ url: page.url
+ };
+ });
+ let engineNames = Object.keys(searchConfig.engines);
+ let engineItems = engineNames.filter(name => name.startsWith(keywords))
+ .map(name => ({
+ caption: name,
+ content: command + ' ' + 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, settings) => {
+ switch (name) {
+ case 'o':
+ case 'open':
+ // TODO use search engined and pass keywords to them
+ return openCommand(normalizeUrl(remaining, settings.search));
+ case 't':
+ case 'tabopen':
+ return tabopenCommand(normalizeUrl(remaining, settings.search));
+ case 'b':
+ case 'buffer':
+ return bufferCommand(remaining);
+ }
+ throw new Error(name + ' command is not defined');
+};
+
+const getCompletions = (command, keywords, settings) => {
+ switch (command) {
+ case 'o':
+ case 'open':
+ case 't':
+ case 'tabopen':
+ return getOpenCompletions(command, keywords, settings.search);
+ case 'b':
+ case 'buffer':
+ return tabs.getCompletions(keywords).then((gotTabs) => {
+ let items = gotTabs.map((tab) => {
+ return {
+ caption: tab.title,
+ content: command + ' ' + tab.title,
+ url: tab.url,
+ icon: tab.favIconUrl
+ };
+ });
+ return [
+ {
+ name: 'Buffers',
+ items: items
+ }
+ ];
+ });
+ }
+ return Promise.resolve([]);
+};
+
+const exec = (line, settings) => {
+ let name = line.split(' ')[0];
+ let remaining = line.replace(name + ' ', '');
+ return doCommand(name, remaining, settings);
+};
+
+const complete = (line, settings) => {
+ let command = line.split(' ', 1)[0];
+ let keywords = line.replace(command + ' ', '');
+ return getCompletions(command, keywords, settings);
+};
+
+export { exec, complete };