aboutsummaryrefslogtreecommitdiffstats
path: root/mixiecho.js
blob: 953588f57cc446092ff2d66bd2d1331bb57c53c3 (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// Vimperator plugin: "Update mixi echo"
// Last Change: 21-Oct-2008. Jan 2008
// License: Creative Commons
// Maintainer: mattn <mattn.jp@gmail.com> - http://mattn.kaoriya.net/

(function(){
	var ucnv = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
		.createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
	ucnv.charset = "EUC-JP";
	function sprintf(format){
		var i = 1, re = /%s/, result = "" + format;
		while (re.test(result) && i < arguments.length) result = result.replace(re, arguments[i++]);
		return result;
	}
	function parseHTML(str, ignoreTags) {
		var exp = "^[\\s\\S]*?<html(?:\\s[^>]*)?>|</html\\s*>[\\S\\s]*$";
		if (ignoreTags) {
			if (typeof ignoreTags == "string") ignoreTags = [ignoreTags];
			var stripTags = [];
			ignoreTags = ignoreTags.filter(function(tag) tag[tag.length - 1] == "/" || !stripTags.push(tag))
			                       .map(function(tag) tag.replace(/\/$/, ""));
			if (stripTags.length > 0) {
				stripTags = stripTags.length > 1
						  ? "(?:" + stripTags.join("|") + ")"
						  : String(stripTags);
				exp += "|<" + stripTags + "(?:\\s[^>]*|/)?>|</" + stripTags + "\\s*>";
			}
		}
		str = str.replace(new RegExp(exp, "ig"), "");
		var res = document.implementation.createDocument(null, "html", null);
		var range = document.createRange();
		range.setStartAfter(window.content.document.body);
		res.documentElement.appendChild(res.importNode(range.createContextualFragment(str), true));
		if (ignoreTags) ignoreTags.forEach(function(tag) {
			var elements = res.getElementsByTagName(tag);
			for (var i = elements.length, el; el = elements.item(--i); el.parentNode.removeChild(el));
		});
		return res;
	}
	function getElementsByXPath(xpath, node){
		node = node || document;
		var nodesSnapshot = (node.ownerDocument || node).evaluate(xpath, node, null,
				XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
		var data = [];
		for(var i = 0, l = nodesSnapshot.snapshotLength; i < l;
				data.push(nodesSnapshot.snapshotItem(i++)));
		return (data.length > 0) ? data : null;
	}
	function getFirstElementByXPath(xpath, node){
		node = node || document;
		var result = (node.ownerDocument || node).evaluate(xpath, node, null,
				XPathResult.FIRST_ORDERED_NODE_TYPE, null);
		return result.singleNodeValue ? result.singleNodeValue : null;
	}
	function showFollowersStatus(){
		var xhr = new XMLHttpRequest();
		xhr.open("GET", "http://mixi.jp/recent_echo.pl", false);
		xhr.send(null);
		var nodes = getElementsByXPath('id("echo")//div[@class="archiveList"]//tr', parseHTML(xhr.responseText, ['script']));
		var statuses = [];
		if (nodes && nodes.length) nodes.forEach(function(node) {
			var img = getFirstElementByXPath('.//img', node).src;
			var name = getFirstElementByXPath('.//*[@class="nickname"]', node).textContent.replace(/(?:\r?\n|\r)[ \t]*/g, "");
			var c = getFirstElementByXPath('.//*[@class="comment"]', node).childNodes;
			var text = '';
			for (var n = 0; n < c.length; n++) {
				if (c[n].nodeName.toUpperCase() == 'SPAN') break;
				text += c[n].textContent.replace(/^\s+|\s+$/g, '').replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;');
				if (c[n].nodeName.toUpperCase() == 'A') text += ' ';
			}
			statuses.push({
				user : {
					profile_image_url : img,
					name : name,
					screen_name : name
				},
				text : text
			});
		});
		var html = <style type="text/css"><![CDATA[
			span.twitter.entry-content a { text-decoration: none; }
			img.twitter.photo { border; 0px; width: 16px; height: 16px; vertical-align: baseline; }
		]]></style>.toSource()
				   .replace(/(?:\r?\n|\r)[ \t]*/g, " ") +
			statuses.map(function(status)
				<>
					<img src={status.user.profile_image_url}
						 alt={status.user.screen_name}
						 title={status.user.screen_name}
						 class="twitter photo"/>
					<strong>{status.user.name}&#x202C;</strong>
				</>.toSource()
				   .replace(/(?:\r?\n|\r)[ \t]*/g, " ") +
					sprintf(': <span class="twitter entry-content">%s&#x202C;</span>', status.text))
						.join("<br/>");
		//liberator.log(html);
		liberator.echo(html, true);
	}
	function sayEcho(text){
		var xhr = new XMLHttpRequest();
		xhr.open("GET", "http://mixi.jp/recent_echo.pl", false);
		xhr.send(null);
		var form = getFirstElementByXPath('//form[@action="add_echo.pl"]', parseHTML(xhr.responseText, ['script']));
		var input = getFirstElementByXPath('.//textarea', form);
		input.value = text;
		var params = [];
		var inputs = getElementsByXPath('.//*[contains(" INPUT TEXTAREA SELECT ", concat(" ", local-name(), " "))]', form);
		inputs.forEach(function(input) { if (input.name.length) params.push(input.name + '=' + escape(ucnv.ConvertFromUnicode(input.value))); });
		xhr.open("POST", "http://mixi.jp/add_echo.pl", false);
		xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xhr.send(params.join('&'));
	}
	commands.addUserCommand(["mixiecho"], "Change mixi echo",
		function(arg, special){
			arg = arg.string;
			if (special || arg.length == 0)
				showFollowersStatus()
			else
				sayEcho(arg);
		},{
			bang: true
		}
	);
})();
an>window.content.window); var selection = win.getSelection(); if (selection.rangeCount < 1) return ''; for (var i=0, c=selection.rangeCount; i<c; i++){ sel += selection.getRangeAt(i).toString(); } return sel; }, get HTMLSEL () { var htmlsel = ''; var win = new XPCNativeWrapper(window.content.window); var selection = win.getSelection(); if (selection.rangeCount < 1) return ''; var serializer = new XMLSerializer(); for (var i=0, c=selection.rangeCount; i<c; i++){ htmlsel += serializer.serializeToString(selection.getRangeAt(i).cloneContents()); } return htmlsel.replace(/<(\/)?(\w+)([\s\S]*?)>/g, function(all, close, tag, attr){ return "<" + close + tag.toLowerCase() + attr + ">"; }); }, get CLIP () { return util.readFromClipboard(); } }; 'hostname pathname host port protocol search hash'.split(' ').forEach(function (name){ REPLACE_TABLE[name.toUpperCase()] = function () content.location && content.location[name]; }); // used when argument is none //const defaultValue = templates[0].label; commands.addUserCommand(['copy'],'Copy to clipboard', function(args){ liberator.plugins.exCopy.copy(args.literalArg, args.bang, !!args["-append"]); },{ completer: function(context, args){ if (args.bang){ completion.javascript(context); return; } context.title = ['Template','Value']; var templates = copy_templates.map(function(template) [template.label, liberator.modules.util.escapeString(template.value, '"')] ); if (!context.filter){ context.completions = templates; return; } var candidates = []; var filter = context.filter.toLowerCase(); context.completions = templates.filter(function(template) template[0].toLowerCase().indexOf(filter) == 0); }, literal: 0, bang: true, options: [ [["-append","-a"], commands.OPTION_NOARG] ] }, true ); function addUserMap(label, map){ mappings.addUserMap([modes.NORMAL,modes.VISUAL], map, label, function(){ liberator.plugins.exCopy.copy(label); }, { rhs: label } ); } function getCopyTemplate(label){ var ret = null; copy_templates.some(function(template) template.label == label ? (ret = template) && true : false); return ret; } function replaceVariable(str){ if (!str) return ''; function replacer(orig, name){ //{{{ if (name == '') return '%'; if (!REPLACE_TABLE.hasOwnProperty(name)) return orig; let value = REPLACE_TABLE[name]; if (typeof value == 'function') return value(); else return value.toString(); return orig; } //}}} return str.replace(/%([A-Z]*)%/g, replacer); } function wedataRegister(item){ var libly = liberator.plugins.libly; var logger = libly.$U.getLogger("copy"); item = item.data; if (excludeLabelsMap[item.label]) return; if (item.custom && item.custom.toLowerCase().indexOf('function') != -1) { if (!liberator.globalVariables.copy_wedata_include_custom || item.label == 'test') { logger.log('skip: ' + item.label); return; } let custom = (function(item){ return function(value, value2){ var STORE_KEY = 'plugins-copy-ok-func'; var store = storage.newMap(STORE_KEY, true); var check = store.get(item.label); var ans; if (!check){ ans = window.confirm( 'warning!!!: execute "' + item.label + '" ok ?\n' + '(this function is working with unsafe sandbox.)\n\n' + '----- execute code -----\n\n' + 'value: ' + item.value + '\n' + 'function: ' + item.custom ); } else { if (item.value == check.value && item.custom == check.custom && item.map == check.map){ ans = true; } else { ans = window.confirm( 'warning!!!: "' + item.label + '" was changed when you registered the function.\n' + '(this function is working with unsafe sandbox.)\n\n' + '----- execute code -----\n\n' + 'value: ' + item.value + '\n' + 'function: ' + item.custom ); } } if (!ans) return; store.set(item.label, item); store.save(); var func; try{ func = window.eval('(' + item.custom + ')'); } catch (e){ logger.echoerr(e); logger.log(item.custom); return; } return func(value, value2); }; })(item); exCopyManager.add(item.label, item.value, custom, item.map); } else { exCopyManager.add(item.label, item.value, null, item.map); } } var exCopyManager = { add: function(label, value, custom, map){ var template = {label: label, value: value, custom: custom, map: map}; copy_templates.unshift(template); if (map) addUserMap(label, map); return template; }, get: function(label){ return getCopyTemplate(label); }, copy: function(arg, special, appendMode){ var copyString = ''; var isError = false; if (special && arg){ try { copyString = liberator.eval(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 = copy_templates[0].label; var template = getCopyTemplate(arg) || {value: arg}; if (typeof template.custom == 'function'){ copyString = template.custom.call(this, template.value, replaceVariable(template.value)); } else if (template.custom instanceof Array){ copyString = replaceVariable(template.value).replace(template.custom[0], template.custom[1]); } else { copyString = replaceVariable(template.value); } } if (appendMode){ copyString = util.readFromClipboard() + copyString; } if (copyString) util.copyToClipboard(copyString); if (isError){ liberator.echoerr('CopiedErrorString: `' + copyString + "'"); } else { liberator.echo('CopiedString: `' + util.escapeHTML(copyString || '') + "'"); } } }; if (liberator.globalVariables.copy_use_wedata){ function loadWedata(){ if (!liberator.plugins.libly){ liberator.echomsg("need a _libly.js when use wedata."); return; } var libly = liberator.plugins.libly; copy_templates.forEach(function(item) excludeLabelsMap[item.label] = item.value); if (liberator.globalVariables.copy_wedata_exclude_labels) liberator.globalVariables.copy_wedata_exclude_labels.forEach(function(item) excludeLabelsMap[item] = 1); var wedata = new libly.Wedata("vimp%20copy"); wedata.getItems(24 * 60 * 60 * 1000, wedataRegister); } loadWedata(); } return exCopyManager; })(); // vim: set fdm=marker sw=4 ts=4 et: