aboutsummaryrefslogtreecommitdiffstats
path: root/ubiquity.js
diff options
context:
space:
mode:
authorteramako2008-09-02 12:54:37 +0000
committerteramako2008-09-02 12:54:37 +0000
commit2183e2b1fb5b50fe0a0e4a325c39ad25607bcda6 (patch)
tree74ff0e0af14f92afb33da65ec66637829f6b5bff /ubiquity.js
parentffa59e7bbbcc369c286a33057b1a19aa0b87a707 (diff)
downloadvimperator-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.js143
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: