aboutsummaryrefslogtreecommitdiffstats
path: root/xpathBlink.js
blob: 8898d95e4e6889381f85bed51ce7fc3ea9151875 (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
/**
 * For vimperator 0.6pre
 * @author teramako teramako@gmail.com
 *
 * Usage:
 *
 * xpath blink nodes
 * :xpathb[link] [EXPRESSION]
 * :xb [EXPERSSION]
 */
(function(){
const Cc = Components.classes;
const Ci = Components.interfaces;
var flasher = null;
function getFlasher(){
	if (!flasher){
		flasher = Cc['@mozilla.org/inspector/flasher;1'].createInstance(Ci.inIFlasher);
		flasher.color = '#FF0000';
		flasher.thickness = 2;
	}
	return flasher;
}
/**
 * @param {Node} aNode
 */
function blink(aNode){
	if (aNode.nodeType == 3) aNode = aNode.parentNode;
	var toggle = true;
	var flasher = getFlasher();
	function setOutline(){
		if(toggle){
			flasher.drawElementOutline(aNode);
		}else {
			flasher.repaintElement(aNode);
		}
		toggle = !toggle;
	}
	for (var i=1; i<7; ++i){
		setTimeout(setOutline, i * 100);
	}
}
liberator.commands.addUserCommand(['xpathb[link]','xb'],'XPath blink nodes',
	function(expression){
		var result
		try {
			result = liberator.buffer.evaluateXPath(expression);
		} catch(e) {
			liberator.echoerr('XPath blink: ' + e);
		}
		if (!result.snapshotLength){
			liberator.echo('XPath blink: none');
			return;
		}
		for (var i=0; i<result.snapshotLength; i++){
			blink(result.snapshotItem(i));
		}
	},{}
);
})();

// vim: set fdm=marker sw=4 ts=4 et:
quote', value: '<blockquote cite="%URL%" title="%TITLE%">%HTMLSEL%</blockquote>' }, * ]); * EOM */ const templates = window.eval(liberator.globalVariables.copy_templates) || [ { label: 'titleAndURL', value: '%TITLE%\n%URL%' }, { label: 'title', value: '%TITLE%' }, { label: 'anchor', value: '<a href="%URL%">%TITLE%</a>' }, { label: 'selanchor', value: '<a href="%URL%" title="%TITLE%">%SEL%</a>' }, { label: 'htmlblockquote', value: '<blockquote cite="%URL%" title="%TITLE%">%HTMLSEL%</blockquote>' } ]; // used when argument is none const defaultValue = templates[0].label; liberator.commands.addUserCommand(['copy'],'Copy to clipboard', function(arg, special){ var copyString = ''; var isError = false; if (special && arg){ try { copyString = window.eval('with(liberator){' + arg + '}'); switch (typeof copyString){ case 'object': copyString = copyString === null ? 'null' : copyString.toSource(); break; case 'function': copyString = copyString.toString(); break; case 'number': case 'boolean': copyString = '' + copyString; break; case 'undefined': copyString = 'undefined'; break; } } catch(e){ isError = true; copyString = e.toString(); } } else { if (!arg){ arg = defaultValue; } var str = getCopyTemplate(arg) || arg; copyString = replaceVariable(str); } liberator.copyToClipboard(copyString); if (isError){ liberator.echoerr('CopiedErrorString: `' + copyString + "'"); } else { liberator.echo('CopiedString: `' + liberator.util.escapeHTML(copyString) + "'"); } },{ completer: function(filter){ if ( liberator.commands.parseCommand(liberator.commandline.getCommand())[2] ){ return liberator.completion.javascript(filter); } var templates = []; for (var option in liberator.options){ if ( option.name.indexOf('copy_') == 0 ){ templates.push([option.names[1], option.value]); } } if (!filter){ return [0,templates]; } var candidates = []; templates.forEach(function(template){ if (template[0].indexOf(filter) == 0 || ('copy_'+template[0]).indexOf(filter) == 0){ candidates.push(template); } }); return [0, candidates]; } } ); function getCopyTemplate(label){ for (var option in liberator.options){ if ( option.hasName('copy_'+label) || option.hasName(label) ){ return option.value; } } return null; } function replaceVariable(str){ if (!str) return; var win = new XPCNativeWrapper(window.content.window); var sel = '',htmlsel = ''; if (str.indexOf('%SEL%') >= 0 || str.indexOf('%HTMLSEL%') >= 0){ sel = win.getSelection().getRangeAt(0); } if (str.indexOf('%HTMLSEL%') >= 0){ var serializer = new XMLSerializer(); htmlsel = serializer.serializeToString(sel.cloneContents()); } return str.replace(/%TITLE%/g,liberator.buffer.title) .replace(/%URL%/g,liberator.buffer.URL) .replace(/%SEL%/g,sel.toString()) .replace(/%HTMLSEL%/g,htmlsel); } templates.forEach(function(template){ liberator.options.add(['copy_'+template.label, template.label], 'Copy template: `' + liberator.util.escapeHTML(template.value) + "'", 'string',template.value, {}); }); //liberator.completion.exTabCompletion = function (str) { // var [count, cmd, special, args] = liberator.commands.parseCommand(str); // var completions = []; // var start = 0; // var matches = str.match(/^:*\d*(?=\w*$)/); // if (matches) { // completions = this.command(cmd); // start = matches[0].length; // } else { // var command = liberator.commands.get(cmd); // if (command && command.completer) { // matches = str.match(/^:*\d*\w+!?\s+/); // start = matches ? matches[0].length : 0; // if (command.hasName("open") || command.hasName("tabopen") || command.hasName("winopen")) { // var skip = args.match(/^(.*,\s+)(.*)/); // if (skip) { // start += skip[1].length; // args = skip[2]; // } // } else if (command.hasName("echo") || command.hasName("echoerr") || // command.hasName("javascript") || command.hasName("copy")) { // var skip = args.match(/^.*?(?=\w*$)/); // if (skip) // start += skip[0].length; // } // completions = command.completer.call(this, args); // } // } // return [0, [start, completions]]; //}; })(); // vim: set fdm=marker sw=4 ts=4 et: