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
};

})();
x">Variables == g:reveal_ie_image_mode_normal = 'r': Hints mode for normal version. g:reveal_ie_image_mode_reverse = 'R': Hints mode for reverse version. ]]></detail> <detail lang="ja"><![CDATA[ == Description == IE Ctrl-A 画像を暴く == Global Variables == g:reveal_ie_image_mode_normal = 'r': 通常版のヒントモード g:reveal_ie_image_mode_reverse = 'R': 反対版のヒントモード ]]></detail> </VimperatorPlugin>; // }}} (function () { let ieimg = 'data:image/gif;base64,'+ 'R0lGODlhAgACAIABAF6BvP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAACAAIA'+ 'AAIDRAIFADs='; let modeN = gv('reveal_ie_image_mode_normal', 'r'); let modeR = gv('reveal_ie_image_mode_reverse', 'R'); function gv (name, def) let (v = liberator.globalVariables[name]) (v === undefined ? def : v); function getAbsPosition (elem) { let rect = elem.getBoundingClientRect(); return { x: Math.max((rect.left + content.scrollX), content.scrollX), y: Math.max((rect.top + content.scrollY), content.scrollY), }; } function reveal (elem, sec, zura) { if (sec <= 0) sec = 5; let body = elem.ownerDocument.body; let indicator = elem.ownerDocument.createElement('div'); let pos = getAbsPosition(elem); //let rect = elem.getBoundingClientRect(); indicator.id = 'detect-hidden-indicator'; let style = 'background-image: url(' + ieimg + ');' + //'opacity: 0.8;' + //TODO 'background-repeat: repeat;' + 'z-index: 999;' + 'position: absolute; ' + 'top: ' + (pos.y + (zura ? 1 : 0)) + 'px;' + 'height:' + elem.clientHeight + 'px;'+ 'left: ' + pos.x + 'px;' + 'width: ' + elem.clientWidth + 'px'; indicator.setAttribute('style', style); body.appendChild(indicator); setTimeout(function () body.removeChild(indicator), sec * 1000); } // for debug if (0) { let xpath = '/html/body/div[2]/div[3]/table/tbody/tr/td[2]/div/table/tbody/tr/td[2]/div/img'; let node = util.evaluateXPath(xpath).snapshotItem(0); reveal(node, 1); } [ [modeN, false], [modeR, true] ].forEach(function ([mode, zura]) { if (!mode) return; hints.addMode( mode, 'Reveal IE Ctrl-A images.' + (zura ? ' (reverse)' : ''), function (elem, loc, count) { reveal(elem, count, zura); }, function () '//img' ); }); commands.addUserCommand( ['revealimage'], 'Reveal IE Ctrl-A images.', function (args) { hints.show(args.bang ? modeR : modeN); }, { bang: true }, true ); })(); // vim:sw=2 ts=2 et si fdm=marker: