aboutsummaryrefslogtreecommitdiff
path: root/src/shared/commands/exec.js
blob: 7248827c904e9f35a7b31a2262bc4ac840e4a90b (plain) (blame)
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
import * as tabs from 'background/tabs';
import * as histories from 'background/histories';

const normalizeUrl = (args, searchConfig) => {
  let concat = args.join(' ');
  try {
    return new URL(concat).href;
  } catch (e) {
    if (concat.includes('.') && !concat.includes(' ')) {
      return 'http://' + concat;
    }
    let query = concat;
    let template = searchConfig.engines[
      searchConfig.default
    ];
    for (let key in searchConfig.engines) {
      if (args[0] === key) {
        query = args.slice(1).join(' ');
        template = searchConfig.engines[key];
      }
    }
    return template.replace('{}', encodeURIComponent(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 winopenCommand = (url) => {
  return browser.windows.create({ url });
};

const bufferCommand = (keywords) => {
  if (keywords.length === 0) {
    return Promise.resolve([]);
  }
  let keywordsStr = keywords.join(' ');
  return browser.tabs.query({
    active: true, currentWindow: true
  }).then((gotTabs) => {
    if (gotTabs.length > 0) {
      if (isNaN(keywordsStr)) {
        return tabs.selectByKeyword(gotTabs[0], keywordsStr);
      }
      let index = parseInt(keywordsStr, 10) - 1;
      return tabs.selectAt(index);
    }
  });
};

const exec = (line, settings) => {
  let words = line.trim().split(/ +/);
  let name = words.shift();

  switch (name) {
  case 'o':
  case 'open':
    return openCommand(normalizeUrl(words, settings.search));
  case 't':
  case 'tabopen':
    return tabopenCommand(normalizeUrl(words, settings.search));
  case 'w':
  case 'winopen':
    return winopenCommand(normalizeUrl(words, settings.search));
  case 'b':
  case 'buffer':
    return bufferCommand(words);
  case '':
    return Promise.resolve();
  }
  throw new Error(name + ' command is not defined');
};

export default exec;