diff options
Diffstat (limited to 'src/console/actions')
-rw-r--r-- | src/console/actions/console.ts | 193 | ||||
-rw-r--r-- | src/console/actions/index.ts | 27 |
2 files changed, 188 insertions, 32 deletions
diff --git a/src/console/actions/console.ts b/src/console/actions/console.ts index f7fa7a2..e44c974 100644 --- a/src/console/actions/console.ts +++ b/src/console/actions/console.ts @@ -1,5 +1,32 @@ import * as messages from '../../shared/messages'; import * as actions from './index'; +import {Command} from "../../shared/Command"; +import CompletionClient from "../clients/CompletionClient"; +import CompletionType from "../../shared/CompletionType"; +import Completions from "../Completions"; +import TabFlag from "../../shared/TabFlag"; + +const completionClient = new CompletionClient(); + +const commandDocs = { + [Command.Set]: 'Set a value of the property', + [Command.Open]: 'Open a URL or search by keywords in current tab', + [Command.TabOpen]: 'Open a URL or search by keywords in new tab', + [Command.WindowOpen]: 'Open a URL or search by keywords in new window', + [Command.Buffer]: 'Select tabs by matched keywords', + [Command.BufferDelete]: 'Close a certain tab matched by keywords', + [Command.BuffersDelete]: 'Close all tabs matched by keywords', + [Command.Quit]: 'Close the current tab', + [Command.QuitAll]: 'Close all tabs', + [Command.AddBookmark]: 'Add current page to bookmarks', + [Command.Help]: 'Open Vim Vixen help in new tab', +}; + +const propertyDocs: {[key: string]: string} = { + 'hintchars': 'hint characters on follow mode', + 'smoothscroll': 'smooth scroll', + 'complete': 'which are completed at the open page', +}; const hide = (): actions.ConsoleAction => { return { @@ -7,34 +34,36 @@ const hide = (): actions.ConsoleAction => { }; }; -const showCommand = (text: string): actions.ConsoleAction => { +const showCommand = async (text: string): Promise<actions.ShowCommand> => { + const completionTypes = await completionClient.getCompletionTypes(); return { type: actions.CONSOLE_SHOW_COMMAND, - text: text + completionTypes, + text, }; }; -const showFind = (): actions.ConsoleAction => { +const showFind = (): actions.ShowFindAction => { return { type: actions.CONSOLE_SHOW_FIND, }; }; -const showError = (text: string): actions.ConsoleAction => { +const showError = (text: string): actions.ShowErrorAction => { return { type: actions.CONSOLE_SHOW_ERROR, text: text }; }; -const showInfo = (text: string): actions.ConsoleAction => { +const showInfo = (text: string): actions.ShowInfoAction => { return { type: actions.CONSOLE_SHOW_INFO, text: text }; }; -const hideCommand = (): actions.ConsoleAction => { +const hideCommand = (): actions.HideCommandAction => { window.top.postMessage(JSON.stringify({ type: messages.CONSOLE_UNFOCUS, }), '*'); @@ -43,9 +72,7 @@ const hideCommand = (): actions.ConsoleAction => { }; }; -const enterCommand = async( - text: string, -): Promise<actions.ConsoleAction> => { +const enterCommand = async(text: string): Promise<actions.HideCommandAction> => { await browser.runtime.sendMessage({ type: messages.CONSOLE_ENTER_COMMAND, text, @@ -53,7 +80,7 @@ const enterCommand = async( return hideCommand(); }; -const enterFind = (text?: string): actions.ConsoleAction => { +const enterFind = (text?: string): actions.HideCommandAction => { window.top.postMessage(JSON.stringify({ type: messages.CONSOLE_ENTER_FIND, text, @@ -61,38 +88,164 @@ const enterFind = (text?: string): actions.ConsoleAction => { return hideCommand(); }; -const setConsoleText = (consoleText: string): actions.ConsoleAction => { +const setConsoleText = (consoleText: string): actions.SetConsoleTextAction => { return { type: actions.CONSOLE_SET_CONSOLE_TEXT, consoleText, }; }; -const getCompletions = async(text: string): Promise<actions.ConsoleAction> => { - const completions = await browser.runtime.sendMessage({ - type: messages.CONSOLE_QUERY_COMPLETIONS, - text, - }); +const getCommandCompletions = (text: string): actions.SetCompletionsAction => { + const items = Object.entries(commandDocs) + .filter(([name]) => name.startsWith(text.trimLeft())) + .map(([name, doc]) => ({ + caption: name, + content: name, + url: doc, + })); + const completions = [{ + name: "Console Command", + items, + }]; return { type: actions.CONSOLE_SET_COMPLETIONS, completions, completionSource: text, + } +}; + +const getOpenCompletions = async( + types: CompletionType[], original: string, command: Command, query: string, +): Promise<actions.SetCompletionsAction> => { + const completions: Completions = []; + for (const type of types) { + switch (type) { + case CompletionType.SearchEngines: { + const items = await completionClient.requestSearchEngines(query); + if (items.length === 0) { + break; + } + completions.push({ + name: 'Search Engines', + items: items.map(key => ({ + caption: key.title, + content: command + ' ' + key.title, + })) + }); + break; + } + case CompletionType.History: { + const items = await completionClient.requestHistory(query); + if (items.length === 0) { + break; + } + completions.push({ + name: 'History', + items: items.map(item => ({ + caption: item.title, + content: command + ' ' + item.url, + url: item.url + })), + }); + break; + } + case CompletionType.Bookmarks: { + const items = await completionClient.requestBookmarks(query); + if (items.length === 0) { + break; + } + completions.push({ + name: 'Bookmarks', + items: items.map(item => ({ + caption: item.title, + content: command + ' ' + item.url, + url: item.url + })) + }); + break; + } + } + } + + return { + type: actions.CONSOLE_SET_COMPLETIONS, + completions, + completionSource: original, }; }; -const completionNext = (): actions.ConsoleAction => { +const getTabCompletions = async ( + original: string, command: Command, query: string, excludePinned: boolean, +): Promise<actions.SetCompletionsAction> => { + const items = await completionClient.requestTabs(query, excludePinned); + let completions: Completions = []; + if (items.length > 0) { + completions = [{ + name: 'Buffers', + items: items.map(item => ({ + content: command + ' ' + item.url, + caption: `${item.index}: ${item.flag != TabFlag.None ? item.flag : ' ' } ${item.title}`, + url: item.url, + icon: item.faviconUrl, + })), + }]; + } + return { + type: actions.CONSOLE_SET_COMPLETIONS, + completions, + completionSource: original, + } +}; + +const getPropertyCompletions = async( + original: string, command: Command, query: string, +): Promise<actions.SetCompletionsAction> => { + const properties = await completionClient.getProperties(); + const items = properties + .map(item => { + const desc = propertyDocs[item.name] || ''; + if (item.type === 'boolean') { + return [{ + caption: item.name, + content: command + ' ' + item.name, + url: 'Enable ' + desc, + }, { + caption: 'no' + item.name, + content: command + ' no' + item.name, + url: 'Disable ' + desc, + }]; + } else { + return [{ + caption: item.name, + content: name + ' ' + item.name, + url: 'Set ' + desc, + }]; + } + }) + .reduce((acc, val) => acc.concat(val), []) + .filter(item => item.caption.startsWith(query)); + const completions: Completions = [{ name: 'Properties', items }]; + return { + type: actions.CONSOLE_SET_COMPLETIONS, + completions, + completionSource: original, + } +}; + +const completionNext = (): actions.CompletionNextAction => { return { type: actions.CONSOLE_COMPLETION_NEXT, }; }; -const completionPrev = (): actions.ConsoleAction => { +const completionPrev = (): actions.CompletionPrevAction => { return { type: actions.CONSOLE_COMPLETION_PREV, }; }; export { - hide, showCommand, showFind, showError, showInfo, hideCommand, setConsoleText, - enterCommand, enterFind, getCompletions, completionNext, completionPrev, + hide, showCommand, showFind, showError, showInfo, hideCommand, setConsoleText, enterCommand, enterFind, + getCommandCompletions, getOpenCompletions, getTabCompletions, getPropertyCompletions, + completionNext, completionPrev, }; diff --git a/src/console/actions/index.ts b/src/console/actions/index.ts index 3770496..e292608 100644 --- a/src/console/actions/index.ts +++ b/src/console/actions/index.ts @@ -1,4 +1,6 @@ -// console commands +import Completions from "../Completions"; +import CompletionType from "../../shared/CompletionType"; + export const CONSOLE_HIDE = 'console.hide'; export const CONSOLE_SHOW_COMMAND = 'console.show.command'; export const CONSOLE_SHOW_ERROR = 'console.show.error'; @@ -10,49 +12,50 @@ export const CONSOLE_COMPLETION_NEXT = 'console.completion.next'; export const CONSOLE_COMPLETION_PREV = 'console.completion.prev'; export const CONSOLE_SHOW_FIND = 'console.show.find'; -interface HideAction { +export interface HideAction { type: typeof CONSOLE_HIDE; } -interface ShowCommand { +export interface ShowCommand { type: typeof CONSOLE_SHOW_COMMAND; text: string; + completionTypes: CompletionType[]; } -interface ShowFindAction { +export interface ShowFindAction { type: typeof CONSOLE_SHOW_FIND; } -interface ShowErrorAction { +export interface ShowErrorAction { type: typeof CONSOLE_SHOW_ERROR; text: string; } -interface ShowInfoAction { +export interface ShowInfoAction { type: typeof CONSOLE_SHOW_INFO; text: string; } -interface HideCommandAction { +export interface HideCommandAction { type: typeof CONSOLE_HIDE_COMMAND; } -interface SetConsoleTextAction { +export interface SetConsoleTextAction { type: typeof CONSOLE_SET_CONSOLE_TEXT; consoleText: string; } -interface SetCompletionsAction { +export interface SetCompletionsAction { type: typeof CONSOLE_SET_COMPLETIONS; - completions: any[]; + completions: Completions; completionSource: string; } -interface CompletionNextAction { +export interface CompletionNextAction { type: typeof CONSOLE_COMPLETION_NEXT; } -interface CompletionPrevAction { +export interface CompletionPrevAction { type: typeof CONSOLE_COMPLETION_PREV; } |