forked from vimpr/vimperator-plugins
-
Notifications
You must be signed in to change notification settings - Fork 0
/
applauncher.js
133 lines (126 loc) · 5.3 KB
/
applauncher.js
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
var PLUGIN_INFO = xml`
<VimperatorPlugin>
<name>AppLauncher</name>
<name lang='ja'>アプリケーションランチャー</name>
<description>Launch defined application</description>
<description lang='ja'>アプリケーションを起動します</description>
<version>0.12</version>
<author>pekepeke</author>
<minVersion>2.0pre</minVersion>
<updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/applauncher.js</updateURL>
<detail lang='ja'><![CDATA[
== Commands ==
:applaunch [name]:
:runapp [name]:
[name] で指定されたアプリケーションを起動します。
== .vimperatorrc example ==
>||
js <<EOM
liberator.globalVariables.applauncher_list = [
[ 'name', 'application path', ['arguments', '%URL%', '%SEL%']],
[ 'Internet Explorer', 'C:\\Program Files\\Internet Explorer\\iexplore.exe', '%URL%'],
[ 'Internet Explorer(Search)', 'C:\\Program Files\\Internet Explorer\\iexplore.exe', '%SEL%'],
];
liberator.globalVariables.applauncher_charset = 'Shift_JIS';
EOM
||<
%URL% は実行時に選択中のリンクURL、もしくは開いているページのURLに置き換えられます。
%SEL% は選択中の文字列に置き換えられます。
%TITLE% はページのタイトルに置き換えられます。
引数を複数指定する場合は配列形式で指定してください。
applauncher_charset を指定すると、渡される文字列が指定の文字セットに変換されます。
]]></detail>
</VimperatorPlugin>`;
liberator.plugins.AppLauncher = (function(){
const UConv = Cc['@mozilla.org/intl/scriptableunicodeconverter'].getService(Ci.nsIScriptableUnicodeConverter);
const AppName = 'AppLauncher';
var global = liberator.globalVariables;
var settings = global.applauncher_list || [];
var defaultCharset = global.applauncher_charset;
if (!settings || settings.length <= 0) return;
var completer = settings.map( function([name, app, args]) [name, args ? app + ' ' + args.toString(): app] );
var Class = function() function(){ this.initialize.apply(this, arguments); };
var AppLauncher = new Class();
AppLauncher.prototype = {
initialize: function(){
this.buildMenu();
this.registerCommand();
},
registerCommand: function(){
var self = this;
['', 'other'].forEach(function (suffix) {
commands.addUserCommand(['applaunch' + suffix, 'runapp' + suffix], 'Run Defined Application',
function(arg){
let app = (typeof arg.string == 'undefined' ? arg : arg.literalArg);
self.launch(app, suffix && arg[0]);
}, {
literal: suffix ? 1 : 0,
completer: function(context, arg){
if (suffix && arg.length <= 1) {
return completion.url(context, 'hsl');
}
var filter = context.filter;
context.title = [ 'Name', 'Description'];
if (!filter){
context.completions = completer;
return;
}
filter = filter.toLowerCase();
context.completions = completer.filter( function(el) el[0].toLowerCase().indexOf(filter) == 0);
}
}, true);
});
},
buildMenu: function(){
var self = this;
var menu = document.getElementById('contentAreaContextMenu')
.appendChild(document.createElement('menu'));
menu.setAttribute('id', AppName + 'Context');
menu.setAttribute('label', AppName);
menu.setAttribute('accesskey', 'L');
var menupopup = menu.appendChild(document.createElement('menupopup'));
menupopup.setAttribute('id', AppName + 'ContextMenu');
for (let i=0, l=settings.length; i<l; i++){
let [name, app, args] = settings[i];
let menuitem = menupopup.appendChild(document.createElement('menuitem'));
menuitem.setAttribute('id', AppName + i);
menuitem.setAttribute('label', name + '\u3092\u8D77\u52D5');
menuitem.addEventListener('command', function() self.launch(name), false);
}
},
variables: {
__noSuchMethod__: function(name) name,
URL: function() gContextMenu && gContextMenu.onLink ? gContextMenu.getLinkURL() : buffer.URL,
SEL: function(){
var selection = window.content.window.getSelection();
var sel = '';
for (let i=0, l=selection.rangeCount; i<l; i++) sel+=selection.getRangeAt(i).toString();
return sel;
},
TITLE: function() buffer.title
},
launch: function(appName, url){
var self = this;
let vars = self.variables;
if (url) {
vars = Object.create(vars);
vars.URL = function() url;
}
appName = appName.replace(/\\+/g, ''); // fix commandline input ' ' -> '\ '
settings.some( function([name, app, args]){
args = args instanceof Array ? args : args ? [args] : [];
args = args.map( function( val ) val.replace(/%([A-Z]+)%/g, function( _, name ) vars[name]()) );
if (defaultCharset){
UConv.charset = defaultCharset;
args = args.map( function( val ) UConv.ConvertFromUnicode(val) );
}
if (appName == name){
io.run(app, args);
return true;
}
return false;
});
}
}
return new AppLauncher();
})();