aboutsummaryrefslogtreecommitdiffstats
path: root/keywordstore.js
blob: 2c47973caf79fa921274b88751a7a5072a3d35ae (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
/**
 * ==VimperatorPlugin==
 * @name			KeywordStore.js
 * @description			Store the keywords when ":open" or ":tabopen" launched
 * @author			Y. Maeda (clouds.across.the.moon@gmail.com)
 * @link			
 * @version			0.1
 * ==/VimperatorPlugin==
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Usage:
 *  :kssearch <str>
 * if <str> is nothing, incremental search starts by last keyword used by ":open" or ":tabopen".
 * <str> can be completed by using history of keywords.
 * 
 * Tested on:
 *	Firefox version: 3.0.3
 *	Vimperator version: 1.2
 *		URL: https://addons.mozilla.org/firefox/addon/4891
 */
(function (){
var queue = [];

function push(strs){
	for(let i = strs.length; i-- > 0;){
//		if((strs[i] != "") && !(queue.some(function(s){return s==strs[i]} ))){
		if(strs[i] != "" && queue[0] != strs[i]){
			queue.unshift(strs[i]);
		}
	}
}

function search(str){
	str = str || queue[0];
	liberator.commandline.open("/", str, modes.SEARCH_FORWARD);
}

function suggestions(str){
	return queue
		  .filter(function(i) i.indexOf(str) == 0)
		   .map(function(i) [i, "Stored Keyword"]);
}

function completer(str){
		return [0, suggestions(str)];
}


/* 元のwindow.getShortcutOrURIを退避しておく。*/
var __getShortcutOrURI;
if(!plugins["keywordStore"] || !plugins.keywordStore["__getShortcutOrURI"]){
	__getShortcutOrURI = window.getShortcutOrURI;
}else{
	__getShortcutOrURI = plugins.keywordStore.__getShortcutOrURI;
}

/* ":open"等が呼ばれたときに、キーワードをキューに入れるようにwindow.getShortcutOrURIを置き換える */
window.getShortcutOrURI = function(aURL, aPostDataRef){
	push(aURL.split(/[ \t\r\n]+/).slice(1));
	return __getShortcutOrURI(aURL, aPostDataRef);
};

/***  User Command ***/
commands.addUserCommand(['kssearch'], 'KeywordStore search',
	search,
	{completer: completer}, true);

/***  外からも使えるように ***/
liberator.plugins.keywordStore = {
	push:		push,
	search:		search,
	suggestions:	suggestions,
	completer:	completer,
	queue:		queue,

	/* 元のwindow.getShortcutOrURIの退避先 */
	__getShortcutOrURI:	__getShortcutOrURI
};

})();
an class="p">.stopPropagation(); event.preventDefault(); } function updateSelector(){ for (var i=0; i<tooltipbox.childNodes.length; i++){ tooltipbox.childNodes[i].style.color = (i+1).toString().indexOf(currentNum+1) == 0 ? "red" : "black"; } } function itemOpen(target){ if (target.hasAttribute('oncommand')){ var fn = new Function("event", target.getAttribute("oncommand")); if (where == liberator.CURRENT_TAB) fn.call(target, {button:0, ctrlKey:false}); else fn.call(target, {button:1, ctrlKey:true}); } else { liberator.open(target.node.uri, where); } closeMenus(target); liberator.options.guioptions = manager.go; } function folderOpen(target){ target.firstChild.showPopup(); manager.quit(); manager.show(target.firstChild); } function toolbarOpen(target){ if (target.getAttribute('container') == 'true'){ folderOpen(target); return true; } else { itemOpen(target); } return false; } var hints = []; var toolbar; var current; var currentNum = 0; var useShift = false; var where = liberator.CURERNT_TAB; var manager = { get toolbar(){ return getToolbar(); }, go : null, get where(){ return where; }, set where(value){ where = value; }, startup: function(where){ this.go = options.guioptions; options.guioptions += "b"; this.where = where; liberator.modes.setCustomMode('BookmarksToolbar-Hint', function(){return;}, this.quit); this.show(); }, show:function(node){ liberator.modes.set(liberator.modes.CUSTOM, liberator.modes.QUICK_HINT); hints = []; window.addEventListener('keypress',onKeyPress,true); current = node || getToolbar(); for (var i=0; i<current.childNodes.length; i++){ var button = current.childNodes[i]; if (button.localName == "menuseparator") continue; hints.push(button); var tooltip = createTooltip(); tooltip.showPopup(button, -1, -1,"tooltip","topleft","topright"); } updateSelector(); }, onEvent: function(event){ var key = liberator.events.toString(event); switch(key){ case "<Esc>": case "<C-[>": closeMenus(current); liberator.options.guioptions = this.go; break; case "<Return>": if (toolbarOpen(hints[currentNum])) return; break; case "f": this.where = liberator.CURRENT_TAB; return; case "F": case "t": this.where = liberator.NEW_TAB; return; case "<Tab>": case "j": case "<S-Tab>": case "k": if (key == "j" || key == "<Tab>"){ currentNum = hints.length -1 == currentNum ? 0 : currentNum + 1; } else { currentNum = currentNum == 0 ? hints.length -1 : currentNum - 1; } useShift = true; updateSelector(); return; case "l": if (hints[currentNum].getAttribute("container") == "true"){ folderOpen(hints[currentNum]); } return; case "<BS>": if (key == "<BS>" && currentNum > 0){ currentNum = Math.floor(currentNum / 10); updateSelector(); return; } case "h": if (current == this.toolbar){ closeMenus(current); liberator.options.guioptions = this.go; this.quit(); } else { current.hidePopup(); clearTooltips(); this.show(current.parentNode.parentNode); } return; default: if (/^[0-9]$/.test(key)){ var num = parseInt(key,10); if (!useShift && currentNum) num += currentNum * 10; if (hints.length >= num*10){ currentNum = num - 1; updateSelector(); return; } if (hints[num-1]){ if (toolbarOpen(hints[num-1])) return; } } } liberator.plugins.bookmarkToolbarHints.quit(); }, quit: function(){ currentNum = 0; useShift = false; window.removeEventListener('keypress',onKeyPress,true); liberator.modes.reset(true); while(tooltipbox.hasChildNodes()){ tooltipbox.firstChild.hidePopup(); tooltipbox.removeChild(tooltipbox.firstChild); } } }; var tooltipbox = document.createElement('box'); tooltipbox.setAttribute('id','liberator-tooltip-container'); document.getElementById('liberator-container').appendChild(tooltipbox); return manager; })(); liberator.mappings.addUserMap([liberator.modes.NORMAL], ['<Leader>f'], 'Start Toolbar-HINTS (open current tab)', function(){ plugins.bookmarkToolbarHints.startup(liberator.CURRENT_TAB); } ); liberator.mappings.addUserMap([liberator.modes.NORMAL], ['<Leader>F'], 'Start Toolbar-HINTS (open new tab)', function(){ plugins.bookmarkToolbarHints.startup(liberator.NEW_TAB); } );