diff options
| author | Shin'ya Ueoka <ueokande@i-beam.org> | 2017-10-11 21:01:57 +0900 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-10-11 21:01:57 +0900 | 
| commit | 141889082456efc9f10561dc0625dc2db6821bfc (patch) | |
| tree | d5cb01b25d4f145b74cbc05fc660d4229adea43e /src/shared | |
| parent | 5e133d6c43cd9c5c07eae81985aef52d44517345 (diff) | |
| parent | b2fad97cbac9df918e44e5edf2e617bca7cea8a4 (diff) | |
Merge pull request #49 from ueokande/fix-console-tokenizer
Fix console tokenizer
Diffstat (limited to 'src/shared')
| -rw-r--r-- | src/shared/commands.js | 58 | 
1 files changed, 36 insertions, 22 deletions
| diff --git a/src/shared/commands.js b/src/shared/commands.js index 2d95e84..61044ec 100644 --- a/src/shared/commands.js +++ b/src/shared/commands.js @@ -1,20 +1,21 @@  import * as tabs from 'background/tabs';  import * as histories from 'background/histories'; -const normalizeUrl = (string, searchConfig) => { +const normalizeUrl = (args, searchConfig) => { +  let concat = args.join(' ');    try { -    return new URL(string).href; +    return new URL(concat).href;    } catch (e) { -    if (string.includes('.') && !string.includes(' ')) { -      return 'http://' + string; +    if (concat.includes('.') && !concat.includes(' ')) { +      return 'http://' + concat;      } -    let query = encodeURI(string); +    let query = encodeURI(concat);      let template = searchConfig.engines[        searchConfig.default      ];      for (let key in searchConfig.engines) { -      if (string.startsWith(key + ' ')) { -        query = encodeURI(string.replace(key + ' ', '')); +      if (args[0] === key) { +        query = args.slice(1).join(' ');          template = searchConfig.engines[key];        }      } @@ -87,40 +88,57 @@ const getOpenCompletions = (command, keywords, searchConfig) => {    });  }; -const doCommand = (name, remaining, settings) => { +const doCommand = (line, settings) => { +  let words = line.trim().split(/ +/); +  let name = words.shift(); +    switch (name) {    case 'o':    case 'open': -    return openCommand(normalizeUrl(remaining, settings.search)); +    return openCommand(normalizeUrl(words, settings.search));    case 't':    case 'tabopen': -    return tabopenCommand(normalizeUrl(remaining, settings.search)); +    return tabopenCommand(normalizeUrl(words, settings.search));    case 'w':    case 'winopen': -    return winopenCommand(normalizeUrl(remaining, settings.search)); +    return winopenCommand(normalizeUrl(words, settings.search));    case 'b':    case 'buffer': -    return bufferCommand(remaining); +    return bufferCommand(words); +  case '': +    return Promise.resolve();    }    throw new Error(name + ' command is not defined');  }; -const getCompletions = (command, keywords, settings) => { -  switch (command) { +const getCompletions = (line, settings) => { +  let typedWords = line.trim().split(/ +/); +  let typing = ''; +  if (!line.endsWith(' ')) { +    typing = typedWords.pop(); +  } + +  if (typedWords.length === 0) { +    return Promise.resolve([]); +  } +  let name = typedWords.shift(); +  let keywords = typedWords.concat(typing).join(' '); + +  switch (name) {    case 'o':    case 'open':    case 't':    case 'tabopen':    case 'w':    case 'winopen': -    return getOpenCompletions(command, keywords, settings.search); +    return getOpenCompletions(name, 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, +          content: name + ' ' + tab.title,            url: tab.url,            icon: tab.favIconUrl          }; @@ -137,15 +155,11 @@ const getCompletions = (command, keywords, settings) => {  };  const exec = (line, settings) => { -  let name = line.split(' ')[0]; -  let remaining = line.replace(name + ' ', ''); -  return doCommand(name, remaining, settings); +  return doCommand(line, settings);  };  const complete = (line, settings) => { -  let command = line.split(' ', 1)[0]; -  let keywords = line.replace(command + ' ', ''); -  return getCompletions(command, keywords, settings); +  return getCompletions(line, settings);  };  export { exec, complete }; | 
