aboutsummaryrefslogtreecommitdiff
path: root/src/background/usecases/completions.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/background/usecases/completions.js')
-rw-r--r--src/background/usecases/completions.js150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/background/usecases/completions.js b/src/background/usecases/completions.js
new file mode 100644
index 0000000..2bf5b3b
--- /dev/null
+++ b/src/background/usecases/completions.js
@@ -0,0 +1,150 @@
+import CompletionItem from '../domains/completion-item';
+import CompletionGroup from '../domains/completion-group';
+import Completions from '../domains/completions';
+import CommandDocs from '../domains/command-docs';
+import CompletionRepository from '../repositories/completions';
+import * as filters from './filters';
+import SettingRepository from '../repositories/setting';
+import * as properties from '../../shared/settings/properties';
+
+const COMPLETION_ITEM_LIMIT = 10;
+
+export default class CompletionsInteractor {
+ constructor() {
+ this.completionRepository = new CompletionRepository();
+ this.settingRepository = new SettingRepository();
+ }
+
+ queryConsoleCommand(prefix) {
+ let keys = Object.keys(CommandDocs);
+ let items = keys
+ .filter(name => name.startsWith(prefix))
+ .map(name => ({
+ caption: name,
+ content: name,
+ url: CommandDocs[name],
+ }));
+
+ if (items.length === 0) {
+ return Promise.resolve(Completions.empty());
+ }
+ return Promise.resolve(
+ new Completions([new CompletionGroup('Console Command', items)])
+ );
+ }
+
+ async queryOpen(name, keywords) {
+ let groups = [];
+ let engines = await this.querySearchEngineItems(name, keywords);
+ if (engines.length > 0) {
+ groups.push(new CompletionGroup('Search Engines', engines));
+ }
+ let histories = await this.queryHistoryItems(name, keywords);
+ if (histories.length > 0) {
+ groups.push(new CompletionGroup('History', histories));
+ }
+ let bookmarks = await this.queryBookmarkItems(name, keywords);
+ if (bookmarks.length > 0) {
+ groups.push(new CompletionGroup('Bookmarks', bookmarks));
+ }
+ return new Completions(groups);
+ }
+
+ queryBuffer(name, keywords) {
+ return this.queryTabs(name, false, keywords);
+ }
+
+ queryBdelete(name, keywords) {
+ return this.queryTabs(name, true, keywords);
+ }
+
+ queryBdeleteForce(name, keywords) {
+ return this.queryTabs(name, false, keywords);
+ }
+
+ querySet(name, keywords) {
+ let items = Object.keys(properties.docs).map((key) => {
+ if (properties.types[key] === 'boolean') {
+ return [
+ new CompletionItem({
+ caption: key,
+ content: name + ' ' + key,
+ url: 'Enable ' + properties.docs[key],
+ }),
+ new CompletionItem({
+ caption: 'no' + key,
+ content: name + ' no' + key,
+ url: 'Disable ' + properties.docs[key],
+ }),
+ ];
+ }
+ return [
+ new CompletionItem({
+ caption: key,
+ content: name + ' ' + key,
+ url: 'Set ' + properties.docs[key],
+ })
+ ];
+ });
+ items = items.reduce((acc, val) => acc.concat(val), []);
+ items = items.filter((item) => {
+ return item.caption.startsWith(keywords);
+ });
+ if (items.length === 0) {
+ return Promise.resolve(Completions.empty());
+ }
+ return Promise.resolve(
+ new Completions([new CompletionGroup('Properties', items)])
+ );
+ }
+
+ async queryTabs(name, excludePinned, args) {
+ let tabs = await this.completionRepository.queryTabs(args, excludePinned);
+ let items = tabs.map(tab => new CompletionItem({
+ caption: tab.title,
+ content: name + ' ' + tab.title,
+ url: tab.url,
+ icon: tab.favIconUrl
+ }));
+ if (items.length === 0) {
+ return Promise.resolve(Completions.empty());
+ }
+ return new Completions([new CompletionGroup('Buffers', items)]);
+ }
+
+ async querySearchEngineItems(name, keywords) {
+ let settings = await this.settingRepository.get();
+ let engines = Object.keys(settings.search.engines)
+ .filter(key => key.startsWith(keywords));
+ return engines.map(key => new CompletionItem({
+ caption: key,
+ content: name + ' ' + key,
+ }));
+ }
+
+ async queryHistoryItems(name, keywords) {
+ let histories = await this.completionRepository.queryHistories(keywords);
+ histories = [histories]
+ .map(filters.filterBlankTitle)
+ .map(filters.filterHttp)
+ .map(filters.filterByTailingSlash)
+ .map(pages => filters.filterByPathname(pages, COMPLETION_ITEM_LIMIT))
+ .map(pages => filters.filterByOrigin(pages, COMPLETION_ITEM_LIMIT))[0]
+ .sort((x, y) => x.visitCount < y.visitCount)
+ .slice(0, COMPLETION_ITEM_LIMIT);
+ return histories.map(page => new CompletionItem({
+ caption: page.title,
+ content: name + ' ' + page.url,
+ url: page.url
+ }));
+ }
+
+ async queryBookmarkItems(name, keywords) {
+ let bookmarks = await this.completionRepository.queryBookmarks(keywords);
+ return bookmarks.map(page => new CompletionItem({
+ caption: page.title,
+ content: name + ' ' + page.url,
+ url: page.url
+ }));
+ }
+}