(original) (raw)

// PLUGIN_INFO//{{{ var PLUGIN_INFO = {NAME} character hint mode. hogelog 0.3.1 2.3pre 2010/01/26 2.3pre http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/char-hints-mod2.js ; //}}} (function () { // const DEFAULT_HINTCHARS = "HJKLASDFGYUIOPQWERTNMZXCVB"; const DEFAULT_HINTCHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const hintContext = modules.hints; let hintchars = DEFAULT_HINTCHARS; // let inputCase = function(str) str.toUpperCase(); // let inputRegex = /[A-Z]/; // let showCase = function(str) str.toUpperCase(); let inputCase = function(str) str.toLowerCase(); let inputRegex = /[a-z]/; let showCase = function(str) str.toLowerCase(); // let getStartCount = function() 0; let getStartCount = function() -1; let timer = null; function chars2num(chars) //{{{ { let num = 0; hintchars = inputCase(hintchars); let base = hintchars.length; for(let i=0,l=chars.length;i<l;++i) {="" num="base*num" +="" hintchars.indexof(chars[i]);="" }="" return="" num;="" }}}="" function="" num2chars(num)="" {{{="" let="" chars="" ;="" hintchars="inputCase(hintchars);" base="hintchars.length;" do="" %="" base))]="" chars;="" while(num="">0); return chars; } //}}} function getAdjustStartCount(base, count) //{{{ { if(count < base) { return 0; } else if(count >= Math.pow(base, 2)) { return base; } var start = Math.floor(count / base); var adjust = count + start; var next_start; while(start != (next_start = Math.floor(adjust / base))) { adjust += start; start = next_start; } return start; } //}}} function getCharHints(win) //{{{ { let hints = []; (function (win) { let elems = [elem for(elem in util.evaluateXPath('//*[@liberator:highlight="Hint" and @number]', win.document))]; hints = hints.concat(elems); Array.forEach(win.frames, arguments.callee); })(win); return hints; } //}}} function showCharHints(hints) //{{{ { let start = getStartCount(hintchars.length, hints.length); for(let i=0,len=hints.length;i<len;++i) {="" let="" hint="hints[i];" num="hint.getAttribute("number");" hintchar="num2chars(parseInt(num," 10)+start);="" hint.setattribute("hintchar",="" showcase(hintchar));="" }="" }}}="" function="" isvalidhint(hintinput,="" hint)="" {{{="" if(hintinput.length="=" 0)="" return="" false;="" inputcase(hintchar).indexof(hintinput)="=" 0;="" setiotype(type)="" switch="" (type)="" case="" "i":="" inputcase="function(str)" str.touppercase();="" inputregex="/[A-Z]/;" break;="" str.tolowercase();="" "o":="" showcase="function(str)" clearoriginaltimeout()="" liberator.eval('if(_activetimeout)="" cleartimeout(_activetimeout);_activetimeout="null;'," hintcontext);="" processhintinput(hintinput,="" hints)="" if="" (timer)="" cleartimeout(timer);="" timer="null;" start="getStartCount(hintchars.length," hints.length);="" if(num="" <="" return;="" numstr="String(num);" for(let="" i="0,l=numstr.length;i<l;++i)" events.tostring(e)="" e.liberatorstring="" e.liberatorstring.="" so="" alt="" handled="" as="" press="" number="" event="" by="" vimperator.="" object;="" alt.liberatorstring="num;" charhints.original.onevent.apply(hintcontext,[alt]);="" clearoriginaltimeout();="" statusline.updateinputbuffer(hintinput);="" validhints="hints.filter(function(hint)" hint));="" if(validhints.length="=" 1)="" charhints.original.processhints.apply(hintcontext,[true]);="" true;="" timeout="options["hinttimeout"];" (timeout=""> 0) { timer = setTimeout(function () { charhints.original.processHints.apply(hintContext,[true]); }, timeout); } } //}}} var hintInput = ""; var charhints = plugins.charhints = { show: function (minor, filter, win) //{{{ { charhints.original.show.apply(hintContext, arguments); hintInput = ""; let hints = getCharHints(window.content); showCharHints(hints); }, //}}} onInput: function (event) //{{{ { let eventkey = events.toString(event); if(/^\d$/.test(eventkey)) { commandline.command += eventkey; } let hintString = commandline.command; commandline.command = hintString.replace(inputRegex, ""); charhints.original.onInput.apply(hintContext, arguments); for(let i=0,l=hintString.length;i<l;++i) {="" if(inputregex.test(hintstring[i]))="" hintinput="" +="hintString[i];" }="" let="" hints="getCharHints(window.content);" showcharhints(hints);="" if(hintinput.length="">0) processHintInput(hintInput, hints); }, //}}} onEvent: function (event) //{{{ { if(/^\d$/.test(events.toString(event))) { charhints.onInput(event); } else { charhints.original.onEvent.apply(hintContext,arguments); clearOriginalTimeout(); statusline.updateInputBuffer(hintInput); } }, //}}} processHints: function (followFirst) //{{{ { // don't followFirst if processHints call from // charhints.original.onEvent(alt) in processHintInput let caller = arguments.callee.caller; if(caller == charhints.original.onEvent && caller.caller == processHintInput) return charhints.original.processHints.apply(hintContext,[false]); return charhints.original.processHints.apply(hintContext,arguments); }, //}}} }; if(!charhints.original) { charhints.original = { show: Hints.prototype.show, onInput: Hints.prototype._onInput, onEvent: Hints.prototype.onEvent, processHints: Hints.prototype._processHints, }; charhints.install = function () //{{{ { hints.show = charhints.show; hints.onEvent = charhints.onEvent; liberator.eval("_onInput = liberator.plugins.charhints.onInput", hintContext); liberator.eval("_processHints = liberator.plugins.charhints.processHints", hintContext); liberator.execute(":hi Hint::after content: attr(hintchar)", true, true); if(liberator.globalVariables.hintsio) { let hintsio = liberator.globalVariables.hintsio; Array.forEach(hintsio, setIOType); } if(liberator.globalVariables.hintchars) { hintchars = liberator.globalVariables.hintchars; } if(liberator.globalVariables.hintlabeling) { switch(liberator.globalVariables.hintlabeling) { default: case "s": getStartCount = function() 0; break; case "a": getStartCount = getAdjustStartCount; break; } } }; //}}} charhints.uninstall = function () //{{{ { hints.show = charhints.original.show; hints.onEvent = charhints.original.onEvent; liberator.eval("_onInput = liberator.plugins.charhints.original.onInput", hintContext); liberator.eval("_processHints = liberator.plugins.charhints.original.processHints", hintContext); liberator.execute(":hi Hint::after content: attr(number)", true, true); }; //}}} } charhints.install(); })(); // vim: set fdm=marker sw=4 ts=4 et fenc=utf-8: </l;++i)></len;++i)></l;++i)>