diff options
author | teramako | 2008-09-02 12:54:37 +0000 |
---|---|---|
committer | teramako | 2008-09-02 12:54:37 +0000 |
commit | 2183e2b1fb5b50fe0a0e4a325c39ad25607bcda6 (patch) | |
tree | 74ff0e0af14f92afb33da65ec66637829f6b5bff /ubiquity.js | |
parent | ffa59e7bbbcc369c286a33057b1a19aa0b87a707 (diff) | |
download | vimperator-plugins-2183e2b1fb5b50fe0a0e4a325c39ad25607bcda6.tar.bz2 |
rename "ubiquityGlue.js" to "ubiquity.js"
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@18662 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to 'ubiquity.js')
-rw-r--r-- | ubiquity.js | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/ubiquity.js b/ubiquity.js new file mode 100644 index 0000000..fbdf60f --- /dev/null +++ b/ubiquity.js @@ -0,0 +1,143 @@ +/** + * ==VimperatorPlugin== + * @name Ubiquity Glue + * @description viperator-plugin for Ubiquity + * @depend Ubiquity (ubiquity@labs.mozilla.com) + * @version 0.1a + * ==/VimperatorPlugin== + * + * USAGE: + * + * :ubi[quity] {ubiquityCommand} + * {ubiquityCommand}をUbiquityに渡して実行 + * + * :ubi[quity] + * ランチャを起動 + * + * - ランチャ起動キーでコマンドラインに":ubiquity "がでます(ランチャはポップアップしない) + * 気に入らない場合は、XXX:の辺りのコードをコメントアウトしてください + * - Ubiquityコマンド名の補完が効きます。 + * - Ubiquityコマンド入力後、引数を入力してのタブ補完をするとUbiquityのプレビューがでる(はず) + * + * FIXME: + * - プレビュー時の選択範囲の取得がイマイチ出来てない + * - プレビュー後の操作はマウス必須になってしまう(これはどうしようもない?) + * + */ + +liberator.plugins.ubiquity = (function(){ + +if (!Application.extensions.has('ubiquity@labs.mozilla.com')){ + Components.utils.reportError('Vimperator: UbiquityGlue: Ubiquity is not installed'); + return null; +} +function preExec(target,name,func){ + var original = target[name]; + target[name] = function(){ + var result = func.apply(this,arguments); + var tmp = null; + if (result != false) tmp = original.apply(target,arguments); + return tmp; + } +} + +preExec(liberator.events, 'onEscape', function(){ + if (ubiquityManager.panel.state == 'open') gUbiquity.closeWindow(); +}); +var focusedWindow = null; +var focusedElement = null; +preExec(liberator.commandline, 'open', function(){ + focusedWindow = document.commandDispatcher.focusedWindow; + focusedElement = document.commandDispatcher.focusedElement; +}); + +// XXX:選択範囲が必要な操作が現状上手く動かない.不便であればコメントアウトしてください. +preExec(gUbiquity, 'openWindow', function(anchor, flag){ + if(!flag) { + liberator.commandline.open(':', 'ubiquity ', liberator.modes.EX); + return false; + } +}); + +// ------------------------------------------------- +// Command +// ------------------------------------------------- +liberator.commands.addUserCommand(['ubi[quity]'],'Vimperator Ubiquity Glue', + function(args){ + if (!args){ + gUbiquity.openWindow(getBrowser(), true); + return; + } + ubiquityManager.execute(args); + },{ + completer: function(filter){ + return ubiquityManager.completer(filter); + } + }, + true +); + +// ------------------------------------------------- +// Public Section +// ------------------------------------------------- +var ubiquityManager = { + get panel(){ + return gUbiquity.__msgPanel; + }, + get cmdManager(){ + return gUbiquity.__cmdManager; + }, + get nlParser(){ + return this.cmdManager.__nlParser; + }, + get commands(){ + return this.cmdManager.__cmdSource.getAllCommands(); + }, + execute: function(cmds){ + var context = this.getContext(); + this.nlParser.updateSuggestionList(cmds, context); + if (this.nlParser.getNumSuggestions() == 0){ + liberator.echoerr('No such command'); + return false; + } + var parsedSentence = this.nlParser.getSentence(0); + try { + parsedSentence.execute(context); + } catch (e) { + liberator.echoerr(e); + } + }, + completer: function(args){ + var matches = args.match(/([^\s]+)(?:\s+(.+)$)?/); + var suggestions = []; + for (var cmd in this.commands){ + suggestions.push([cmd , this.commands[cmd].description]); + } + if (!matches){ + return [0, suggestions]; + } + var [cmd, arg] = [matches[1], matches[2]]; + if (arg || (cmd && cmd in this.commands) ){ + if ( (cmd in this.commands) && this.commands[cmd].preview){ + this.getContext(); + gUbiquity.__textBox.value = args; + if (this.panel.state == 'closed') { + gUbiquity.openWindow(getBrowser(), true); + } + gUbiquity.__updatePreview(); + } + } else if (cmd){ + return [0, suggestions.filter(function(command){return command[0].indexOf(cmd) == 0;}) ]; + } + return [0, []]; + }, + getContext: function(){ + gUbiquity.__focusedWindow = focusedWindow; + gUbiquity.__focusedElement = focusedElement; + return gUbiquity.__makeContext(); + } +}; + +return ubiquityManager; +})(); +// vim:ts=4 sw=4 et: |