-
Notifications
You must be signed in to change notification settings - Fork 123
/
Copy pathmixiecho.js
123 lines (122 loc) · 5.08 KB
/
mixiecho.js
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
// Vimperator plugin: "Update mixi echo"
// Last Change: 21-Oct-2008. Jan 2008
// License: Creative Commons
// Maintainer: mattn <[email protected]> - 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, '&').replace(/>/g, '>').replace(/</g, '<');
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}‬</strong>
`.toSource()
.replace(/(?:\r?\n|\r)[ \t]*/g, " ") +
sprintf(': <span class="twitter entry-content">%s‬</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){
if (arg.bang || arg.string.length == 0)
showFollowersStatus()
else
sayEcho(arg.string);
},{
bang: true
}
);
})();