aboutsummaryrefslogtreecommitdiffstats
path: root/tombloo.js
blob: e0ca49101a25479530b5116e805ec5a4ef73b07f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
 * ==VimperatorPlugin==
 * @name           tombloo.js
 * @description    Tombloo integrate plugin
 * @description-ja Tombloo経由で選択領域などをpostする
 * @author         Trapezoid
 * @version        0.1d
 * ==/VimperatorPlugin==
 *
 * Usage:
 *  :tombloo arg                    -> post by Tombloo (don't use prompt)
 *  :tombloo! arg                   -> post by Tombloo (use prompt)
 *  :tomblooAction arg              -> execute Tombloo's action in tool menu
 **/
var TomblooService = Components.classes['@brasil.to/tombloo-service;1'].getService().wrappedJSObject;
function update(target,src,keys){
    if(keys){
        keys.forEach(function(key){
            target[key] = src[key];
        });
    } else {
        for(let key in src)
            target[key] = src[key];
    }

    return target;
}

function getContext(){
    var doc = window.content.document;
    var win = window.content.wrappedJSObject;
    return update(update({
        document  : doc,
        window    : win,
        title     : ''+doc.title || '',
        selection : ''+win.getSelection(),
        target    : doc,
        //event     : event,
        //mouse     : mouse,
        //menu      : gContextMenu,
    },{}),win.location);
}

commands.addUserCommand(['tomblooAction'],'Execute Tombloo actions',
    function(arg){
        TomblooService.Tombloo.Service.actions[arg.string].execute();
    },{
        completer: function(context){
			context.title = ['Tombloo Actions'];
			context.completions = [[name,name] for(name in TomblooService.Tombloo.Service.actions)].filter(function($_){
				return this.test($_[0]);
			}, new RegExp(context.filter, 'i'));
        }
    }
);

commands.addUserCommand(['tombloo'],'Post by Tombloo',
    function(arg,special){
        TomblooService.Tombloo.Service.share(getContext(),TomblooService.Tombloo.Service.extractors[arg.string],special);
    },{
        bang: true,
        completer: function(context){
            var completionList = new Array();
            var exts = TomblooService.Tombloo.Service.check(getContext());
			context.title = ['Tombloo'];
			context.completions = [[exts[i].name, exts[i].name] for(i in exts)].filter(function($_) this.test($_[0]), new RegExp(context.filter, 'i'))
        }
    }
);
="p">, 'Stop Loading Page', '#Browser:Stop'], ['LR' , 'Undo Close Tab', '#History:UndoCloseTab'], ['UL' , 'Select Previous Tab', 'gT', true], ['UR' , 'Select Next Tab', 'gt', true], ['LU' , 'Scroll To Top', function() goDoCommand('cmd_scrollTop')], ['LD' , 'Scroll To Bottom', function() goDoCommand('cmd_scrollBottom')], ['UDR', 'Add Bookmark', ':dialog addbookmark'], ['L>R', 'Forward', '#Browser:Forward'], ['L<R', 'Back', '#Browser:Back'], ['W-' , 'Select Previous Tab', function() gBrowser.tabContainer.advanceSelectedTab(-1, true) ], ['W+' , 'Select Next Tab', function() gBrowser.tabContainer.advanceSelectedTab(+1, true) ], ]; EOM ||< == liberator.globalVariables == - mousegesture_showmsg ジェスチャー情報を表示するかどうか(デフォルト=true:表示する) - mousegesture_rocker ロッカージェスチャを有効にするかどうか(デフォルト=false:無効) - mousegesture_wheel ホイールジェスチャを有効にするかどうか(デフォルト=false:無効) - mousegesture_list ジェスチャー設定2次元配列で指定してください [ <UDLR>, <Description>, <Command>, <noremap flag> ] - UDLR ジェスチャーを指定します UDLRの文字列を指定してください それぞれマウスジェスチャーの↑、↓、←, に対応しています 一応ロッカージェスチャーホイールジェスチャー等にも暫定で対応しています(別途オプションを有効にする必要がある) ロッカージェスチャはL>R(右クリック), L<R(左クリック)で指定可能 ホイールジェスチャは W-(回転), W+(上回転)で指定可能 - Description コマンドの説明文 - Command ジェスチャーが実施された際に実行するコマンドを指定します 以下の3通りの指定が可能です - '#id' document.getElementById(id).doCommand() を実行します - function() { ... } 記述された関数を実行します - ':[command]' Vimperatorのユーザコマンド [command]を実行します - '[key]' キーを送ります - noremap flag キーを送るかつそのキーコードを noremap で処理を行いたい場合true を指定してください ]]></detail> </VimperatorPlugin> liberator.plugins.MouseGestures = (function() { const Ci = Components.interfaces; var global = liberator.globalVariables; if (typeof global.mousegesture_list == 'undefined') return; if (liberator.plugins.MouseGestures) liberator.plugins.MouseGestures.registerEvents('remove'); var Class = function() function() {this.initialize.apply(this, arguments);}; var MouseGestures = new Class(); var doCommandByID = function(id) { if (document.getElementById(id)) document.getElementById(id).doCommand(); }; MouseGestures.prototype = { initialize: function() { this.parseSetting(); var self = this; this.registerEvents('add'); window.addEventListener('unload', function() { self.registerEvents('remove'); }, false); }, parseSetting: function() { var gestures = {}; var self = this; this._showstatus = global.mousegesture_showmsg || true; this._enableRocker = global.mousegesture_rocker || false; this._enableWheel = global.mousegesture_wheel || false; if (this._enableRocker) this.captureEvents.push('draggesture'); if (this._enableWheel) this.captureEvents.push('DOMMouseScroll'); global.mousegesture_list.forEach(function( [gesture, desc, action, noremap] ) { action = action || desc; noremap = noremap || false; if (typeof action == 'string') { let str = action; if (str.charAt(0) == ':') action = function() liberator.execute(str.substr(1)); else if (str.charAt(0) == '#') action = function() doCommandByID(str.substr(1)); else action = function() modules.events.feedkeys(str, noremap); } gestures[gesture] = [desc, action]; }); this.GESTURES = gestures; }, captureEvents : ['mousedown', 'mousemove', 'mouseup', 'contextmenu'], registerEvents: function(action) { var self = this; this.captureEvents.forEach( function(type) { getBrowser().mPanelContainer[action + 'EventListener'](type, self, type == 'contextmenu' || type == 'draggesture'); }); }, set status(msg) { if (this._showstatus) commandline.echo(msg, null, commandline.FORCE_SINGLELINE); }, handleEvent: function(event) { switch(event.type) { case 'mousedown': if (event.button == 2) { this._isMouseDownR = true; this._suppressContext = false; this.startGesture(event); if (this._enableRocker && this._isMouseDownL) { this._isMouseDownR = false; this._suppressContext = true; this._gesture = 'L>R'; this.stopGesture(event); } } else if (this._enableRocker && event.button == 0) { this._isMouseDownL = true; if (this._isMouseDownR) { this._isMouseDownL = false; this._suppressContext = true; this._gesture = 'L<R'; this.stopGesture(event); } } break; case 'mousemove': if (this._isMouseDownR) this.progressGesture(event); break; case 'mouseup': if (this._isMouseDownR && event.button == 2) { this._isMouseDownR = false; this._suppressContext = !!this._gesture; if (this._enableWheel && this._gesture && this._gesture.charAt(0) == 'W') this._gesture = ''; this.stopGesture(event); if (this._shouldFireContext) { // for Linux & Mac this._shouldFireContext = false; let mEvent = event.originalTarget.ownerDocument.createEvent('MouseEvents'); mEvent.initMouseEvent('contextmenu', true, true, aEvent.originalTarget.defaultView, 0, event.screenX, event.screenY, event.clientX, event.clientY, false, false, false, false, 2, null); event.originalTarget.dispatchEvent(mEvent); } } else if (this._isMouseDownL && event.button == 0) this._isMouseDownL = false; break; case 'contextmenu': if (this._suppressContext || this._isMouseDownR) { this._suppressContext = false; this._shouldFireContext = this._isMouseDownR; event.preventDefault(); event.stopPropagation(); } break; case 'DOMMouseScroll': if (this._enableWheel && this._isMouseDownR) { event.preventDefault(); event.stopPropagation(); this._suppressContext = true; this._gesture = 'W' + (event.detail > 0 ? '+' : '-'); this.stopGesture( event, false ); } break; case 'draggesture': this._isMouseDownL = false; break; } }, startGesture: function(event) { this._gesture = ''; this._x = event.screenX; this._y = event.screenY; this._origDoc = event.originalTarget.ownerDocument; this._links = []; }, progressGesture: function(event) { if (!this._origDoc) return; for (let node = event.originalTarget; node; node = node.parentNode) { if (node instanceof Ci.nsIDOMHTMLAnchorElement) { if (this._links.indexOf(node.href) == -1) this._links.push(node.href); break; } } this.timerGesture(); var x = event.screenX, y = event.screenY; var distX = Math.abs(x-this._x), distY = Math.abs(y-this._y); var threshold = 15/ (gBrowser.selectedBrowser.markupDocumentViewer.fullZoom || 1.0); if (distX < threshold && distY < threshold) return; var dir = distX > distY ? (x<this._x ? 'L' : 'R') : (y<this._y ? 'U': 'D'); if (dir != this._gesture.slice(-1)) { this._gesture += dir; this.status = 'Gesture: ' + this._gesture + (this.GESTURES[this._gesture] ? ' (' + this.GESTURES[this._gesture][0] + ')' : ''); } this._x = x; this._y = y; }, timerGesture: function(isClear) { if (this._timer) clearTimeout(this._timer); this._timer = setTimeout( !isClear ? function(self) self.stopGesture({}, true) : function(self) self._timer = self.status = '', 1500, this); }, stopGesture: function(event, cancel) { if (this._gesture) { try { if (cancel) throw 'Gesture Canceled'; let cmd = this.GESTURES[this._gesture] || null; /* if ( !cmd && this.GESTURES['*'] ) { for (let key in this.GESTURES['*']) { if (this.GESTURES['*'][key].test(this._gesture)) { cmd = this.GESTURES[key]; break; } } } */ if (!cmd) throw 'Unknown Gesture: ' + this._gesture; cmd[1].call(this); this.status = 'Gesture: ' + cmd[0]; } catch (exp) { this.status = exp; } this.timerGesture(true); } this._origDoc = this._links = null; } }; return new MouseGestures(); })();