aboutsummaryrefslogtreecommitdiffstats
path: root/applauncher.js
blob: c03cfe5714b67df411389b492d66f1d1cd88300b (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
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
var PLUGIN_INFO =
<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>
  <maxVersion>2.0pre</maxVersion>
  <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/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;
      commands.addUserCommand(['applaunch', 'runapp'], 'Run Defined Application',
        function(arg){
          arg = (typeof arg.string == 'undefined' ? arg : arg.string);
          self.launch(arg);
        }, {
          completer: function(context, arg){
            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);
          }
        });
    },
    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){
      var self = this;
      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 ) self.variables[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();
})();
ss="nx">globalVariables.marker_reader_scroll_ratio) || 0.9; let scroll = win.innerHeight * scroll_ratio; let count = Math.ceil(win.scrollMaxY / scroll); let div = doc.createElementNS(HTML_NAMESPACE, "div"); div.id = "vimperator-marker_reader-markers"; for (let pageNum=2;pageNum<=count+1;++pageNum) { let p = doc.createElementNS(HTML_NAMESPACE, "p"); let id = "vimperator-marker_reader-" + pageNum; p.id = id; if (liberator.globalVariables.marker_reader_pagelink) { p.innerHTML = '<a href="#' + id + '">' + pageNum + "</a>"; } else { p.setAttribute("mousethrough", "always"); //p.innerHTML = ""; } p.className = "vimperator-marker_reader-marker"; p.style.left = "0px"; p.style.top = Math.ceil((pageNum-1)*scroll)+"px"; div.appendChild(p); doc.markers.push(p); } doc.body.appendChild(div); return doc.markers; }, // removeMarkers have to act synchronized function removeMarkers: function(doc) { // this operation have to atomic { if (!doc.markers) return false; doc.markers = null; // } doc.body.removeChild(doc.getElementById("vimperator-marker_reader-markers")); let win = doc.defaultView; let frames = win.frames; if (frames) { for (let i=0,len=frames.length;i<len;++i) if (!reader.removeMarkers(frames[i].document)) return false; } return true; }, currentPage: function(doc) { let win = doc.defaultView; if (win.scrollMaxY == 0) return 1.0; if (!win.scrollbars.visible) return 1.0; let markers = doc.markers; if(!markers) markers = reader.insertMarkers(doc); if(!markers && markers.length==0) return 1.0; let curPos = win.scrollY; // top of page if (curPos <= 0) return 1.0; // bottom of page if (curPos >= win.scrollMaxY) { if (markers.length > 0) { let lastMarker = markers[markers.length-1].offsetTop; if (curPos <= lastMarker) return markers.length; } return markers.length + 0.5; } // return n.5 if between n and n+1 let page = 2.0; for (let i=0,len=markers.length;i<len;++i) { let pos = parseInt(markers[i].offsetTop); if (near(curPos, pos, 1)) return page; if (curPos < pos) return page - 0.5; ++page; } return page - 0.5; }, focusNavi: function(doc, count) { function navi(win, page) { let elem = doc.getElementById("vimperator-marker_reader-" + page); if (elem) { win.scrollTo(win.scrollX, elem.offsetTop); return true; } return false; } let win = doc.defaultView; let curPage = reader.currentPage(doc); let page = (count < 0 ? Math.round : Math.floor)(curPage + count); if (page <= 1) { win.scrollTo(win.scrollX, 0); return true; } else if (navi(win, page)) { return true; } reader.removeMarkers(doc); reader.insertMarkers(doc); curPage = reader.currentPage(doc); page = (count < 0 ? Math.round : Math.floor)(curPage + count); if (navi(win, page)) return true; win.scrollTo(win.scrollX, win.scrollMaxY); return true; }, setAutoInsert: function(set) { if (!set) { window.removeEventListener("resize", onResize, true); gBrowser.removeEventListener("load", onLoad, true); } else { window.addEventListener("resize", onResize, true); gBrowser.addEventListener("load", onLoad, true); } }, }; if (liberator.globalVariables.marker_reader_mapping) { let [down, up] = liberator.globalVariables.marker_reader_mapping.split(/,/); mappings.addUserMap([config.browserModes], [down], "marker PageDown", function (count) { reader.focusNavi(focusDocument(content), count>1 ? count : 1); }, {count: true}); mappings.addUserMap([config.browserModes], [up], "marker PageUp", function (count) { reader.focusNavi(focusDocument(content), -(count>1 ? count : 1)); }, {count: true}); } commands.addUserCommand(["markersinsert", "minsert"], "insert markers", function () { reader.insertMarkers(focusDocument(content)); }); commands.addUserCommand(["markersremove", "mremove"], "remove markers", function () { reader.removeMarkers(focusDocument(content)); }); commands.addUserCommand(["markernext", "mnext"], "marker PageDown", function () { reader.focusNavi(focusDocument(content), 1); }); commands.addUserCommand(["markerprev", "mprev"], "marker PageUp", function () { reader.focusNavi(focusDocument(content), -1); }); if (liberator.globalVariables.marker_reader_onload) { reader.setAutoInsert(true); } return reader; })(); // vim: fdm=marker sw=4 ts=4 et: