aboutsummaryrefslogtreecommitdiffstats
path: root/migemo_completion.js
blob: fcf4135fb555181b85e8c3705ff342793dc0bb1e (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
/**
 * ==VimperatorPlugin==
 * @name           migemo_completion.js
 * @description    replace completion function with using Migemo
 * @description-ja 補完関数をMigemoを使用したものに取り替える
 * @author         Trapezoid
 * @version        0.2
 * ==/VimperatorPlugin==
 *
 * Support commands:
 *  - :buffer
 *  - :sidebar
 *  - :emenu
 *  - :dialog
 *  - :help
 *  - :macros
 *  - :play
 *  and more
 **/

(function(){
  var XMigemoCore = Components.classes["@piro.sakura.ne.jp/xmigemo/factory;1"]
                              .getService(Components.interfaces.pIXMigemoFactory)
                              .getService("ja");
  var XMigemoTextUtils = Components.classes["@piro.sakura.ne.jp/xmigemo/text-utility;1"]
                                   .getService(Components.interfaces.pIXMigemoTextUtils);

  function replaceFunction(target,symbol,f,originalArguments){
      var oldFunction = target[symbol];
      target[symbol] = function() f.apply(target,[oldFunction.apply(target,originalArguments || arguments),arguments]);
  }

  replaceFunction(liberator.modules.completion,"buffer",function(oldResult,args){
      var filter = args[0];
      var migemoPattern = new RegExp(XMigemoCore.getRegExp(filter));
      return [0,oldResult[1].filter(function([value,label]) migemoPattern.test(value) || migemoPattern.test(label))];
  },[""]);

  let orignalFilter = liberator.modules.completion.filter;

  liberator.modules.completion.filter = function(array,filter,matchFromBeginning,favicon){
      if (!filter)
          return orignalFilter.apply(this, arguments);

      let original = XMigemoTextUtils.sanitize(filter);
      let migemoString = XMigemoCore.getRegExp(filter);
      migemoString = original + "|" + migemoString;
      if(matchFromBeginning)
          migemoString ="^(" + migemoString + ")";
      var migemoPattern = new RegExp(migemoString,"i");

      let result = [];
      for (let [,item] in Iterator(array)){
          let text = completion.getKey(item, 'text');
          let complist = text instanceof Array ? text : [text];
          for (let [,compitem] in Iterator(complist)){
              if (migemoPattern.test(compitem) || migemoPattern.test(item[1])){
                item.text = compitem;
                result.push(item);
                break;
              }
          }
      }
      return result;
  };
})();
;'));", "sl_body = sl_body.replace(/ /g,'&nbsp;');", "sl_wheels = sl_wheels.map(function(s) s.replace(/ /g, '&nbsp;'));", 'var sl_patterns = [0, 0, 0, 1, 1, 1];', 'sl_patterns = sl_patterns.map(function(p, i) sl_steam[p] + sl_body + sl_wheels[i]);', 'var sl_counter = 0;', 'var sl_position = 0;', 'var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;', 'var windowWidth = window.innerWidth;', "var sl_style_base ='display: block;position: absolute;text-align: left;overflow: visible;white-space: pre;font: 12px/12px monospace;';", "var sl_style_main =sl_style_base +'top: '+(scrollTop+0)+'px;' +'left: '+windowWidth+'px;' +'padding: 20px;' +'z-index: 999;' +'color: '+sl_tx_color+';';", "document.body.innerHTML += '<div id=\"__sl_main__\" style=\"'+sl_style_main+'\">'+sl_patterns[0]+'</div>';", 'var sl_w = document.getElementById("__sl_main__").clientWidth;', 'var sl_h = document.getElementById("__sl_main__").clientHeight;', "var sl_style_background =sl_style_base +'top: '+(scrollTop+0)+'px;' +'left: 0px;' +'width: '+windowWidth+'px;' +'height: '+sl_h+'px;' +'z-index: 998;' +'background-color: '+sl_bg_color+';' +'filter: alpha(opacity=0);' +'-moz-opacity: 0.0;' +'opacity: 0.0;';", "document.body.innerHTML += '<div id=\"__sl_background__\" style=\"'+sl_style_background+'\"><br></div>';", 'var sl_bg_counter = 0;', 'sl_open = function() {', ' var oid = "__sl_background__";', ' var op = sl_bg_counter;', ' var ua = navigator.userAgent', " document.getElementById(oid).style.filter = 'alpha(opacity=' + (op * 10) + ')';", ' document.getElementById(oid).style.MozOpacity = op / 10;', ' document.getElementById(oid).style.opacity = op / 10;', ' if ( sl_bg_counter < 8 ) {', ' sl_bg_counter++;', " setTimeout('sl_open()',100);", ' } else {', ' sl_run();', ' }}', 'sl_run = function() {', ' document.getElementById("__sl_main__").innerHTML = sl_patterns[sl_counter];', ' document.getElementById("__sl_main__").style.left = windowWidth - sl_position + "px";', ' if (sl_counter < 5) {sl_counter++;} else {sl_counter=0;}', ' sl_position += sl_pitch;', ' if ( sl_w + (windowWidth - sl_position) < 0 ) {', ' sl_counter = 0;', ' sl_position = 0;', ' document.body.removeChild(document.getElementById("__sl_main__"));', ' sl_close();', ' } else {', " setTimeout('sl_run()',sl_speed);", ' }}', 'sl_close = function() {', ' var oid = "__sl_background__";', ' var op = sl_bg_counter;', ' var ua = navigator.userAgent', ' document.getElementById(oid).style.MozOpacity = op / 10;', ' if ( sl_bg_counter > 0 ) {', ' sl_bg_counter--;', " setTimeout('sl_close()',100);", ' } else {', ' document.body.removeChild(document.getElementById(oid));', ' }}', 'sl_open();'].join('\n'); //}}} function sl(){ //'var sl_speed=100,sl_pitch=15,sl_tx_color="#FFFFFF",sl_bg_color="#000000",sl_steam=[];' , var option = { sl_speed : 100, sl_pitch : 15, sl_fg_color : "#FFFFFF", sl_bg_color : "#000000" }; for (let v in option){ if (liberator.globalVariables[v]) option[v] = liberator.globalVariables[v]; } var option_code = "var sl_speed=" + option.sl_speed + ",sl_pitch=" + option.sl_pitch + ",sl_tx_color=\"" + option.sl_fg_color + "\"" + ",sl_bg_color=\"" + option.sl_bg_color + "\";\n"; var script = d.createElement('script'); script.setAttribute('type','application/javascript'); var cdata = document.createCDATASection(option_code + data); //var cdata = d.createComment(data); script.appendChild(cdata); liberator.echo('\n\n\n\n\n\n\n\n\n\n\n\n\n',true); d.body.appendChild(script); }; var orig_beep = liberator.beep; liberator.beep = function(){ if (liberator.options.sl_beep) sl(); else orig_beep(); }; return sl; })();