aboutsummaryrefslogblamecommitdiff
path: root/src/background/shared/completions/index.js
blob: 728cee76854d3a349391459f94bc55696d8e1e31 (plain) (tree)
1
2
3
4
                                         
                                         
 









                                                                         
                                                             
                                




                                          
     
 










                                                             


                                                                 
                                                           











                                  




                                   


                       

















                                                                     





















                                                               
                                                       

                  
                   




                                                       






                                        
                    
import * as tabs from './tabs';
import * as histories from './histories';
import * as bookmarks from './bookmarks';

const getSearchCompletions = (command, keywords, searchConfig) => {
  let engineNames = Object.keys(searchConfig.engines);
  let engineItems = engineNames.filter(name => name.startsWith(keywords))
    .map(name => ({
      caption: name,
      content: command + ' ' + name
    }));
  return Promise.resolve(engineItems);
};

const getHistoryCompletions = (command, keywords) => {
  return histories.getCompletions(keywords).then((pages) => {
    return pages.map((page) => {
      return {
        caption: page.title,
        content: command + ' ' + page.url,
        url: page.url
      };
    });
  });
};

const getBookmarksCompletions = (command, keywords) => {
  return bookmarks.getCompletions(keywords).then((items) => {
    return items.map((item) => {
      return {
        caption: item.title,
        content: command + ' ' + item.url,
        url: item.url,
      };
    });
  });
};

const getOpenCompletions = (command, keywords, searchConfig) => {
  return Promise.all([
    getSearchCompletions(command, keywords, searchConfig),
    getHistoryCompletions(command, keywords),
    getBookmarksCompletions(command, keywords),
  ]).then(([engineItems, historyItems, bookmarkItems]) => {
    let completions = [];
    if (engineItems.length > 0) {
      completions.push({
        name: 'Search Engines',
        items: engineItems
      });
    }
    if (historyItems.length > 0) {
      completions.push({
        name: 'History',
        items: historyItems
      });
    }
    if (bookmarkItems.length > 0) {
      completions.push({
        name: 'Bookmarks',
        items: bookmarkItems
      });
    }
    return completions;
  });
};

const getBufferCompletions = (command, keywords, excludePinned) => {
  return tabs.getCompletions(keywords, excludePinned).then((got) => {
    let items = got.map((tab) => {
      return {
        caption: tab.title,
        content: command + ' ' + tab.title,
        url: tab.url,
        icon: tab.favIconUrl
      };
    });
    return [
      {
        name: 'Buffers',
        items: items
      }
    ];
  });
};

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(name, keywords, settings.search);
  case 'b':
  case 'buffer':
    return getBufferCompletions(name, keywords, false);
  case 'bd!':
  case 'bdel!':
  case 'bdelete!':
  case 'bdeletes!':
    return getBufferCompletions(name, keywords, false);
  case 'bd':
  case 'bdel':
  case 'bdelete':
  case 'bdeletes':
    return getBufferCompletions(name, keywords, true);
  }
  return Promise.resolve([]);
};

const complete = (line, settings) => {
  return getCompletions(line, settings);
};

export { complete };