From 15430b78c6fd521438c686cda3d57fe939ad2f49 Mon Sep 17 00:00:00 2001 From: mattn Date: Tue, 5 Aug 2008 08:44:29 +0000 Subject: 誰か後は頼んだ... ゴブッ(吐血) git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@17104 d0d07461-0603-4401-acd4-de1884942a52 --- mixiecho.js | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 mixiecho.js (limited to 'mixiecho.js') diff --git a/mixiecho.js b/mixiecho.js new file mode 100644 index 0000000..77d9ed4 --- /dev/null +++ b/mixiecho.js @@ -0,0 +1,118 @@ +(function(){ + 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]*?]*)?>|[\\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[^>]*|/)?>|"; + } + } + 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 = []; + 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(/.toSource() + .replace(/(?:\r?\n|\r)[ \t]*/g, " ") + + statuses.map(function(status) + <> + {status.user.screen_name} + {status.user.name}‬ + .toSource() + .replace(/(?:\r?\n|\r)[ \t]*/g, " ") + + sprintf(': %s‬', status.text)) + .join("
"); + + //liberator.log(html); + liberator.echo(html, true); + } + function sayEcho(text){ + /* FIXME TODO: does not work!!!!!!!!!!!!!!!!!!!! + 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) { params.push(input.name + '=' + encodeURIComponent(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('&')); + */ + } + liberator.commands.addUserCommand(["mixiecho"], "Change mixi echo", + function(arg, special){ + if (special || arg.length == 0) + showFollowersStatus() + //else + //sayTwitter(username, password, arg); + }, + { }); +})(); -- cgit v1.2.3