aboutsummaryrefslogtreecommitdiffstats
path: root/pluginManager.js
AgeCommit message (Expand)Author
2009-01-12list method returns xmlteramako
2008-12-28数値としての比較にする.suVene
2008-12-28version の比較を厳密に。suVene
2008-12-25いらない文字が!suVene
2008-12-24response header の解析 bugfix.suVene
2008-12-22 * 正規表現を修正しました。drry
2008-12-22bugfix\!suVene
2008-12-22version は up し忘れることが多いので、Last-Modified を保存し...suVene
2008-12-22 * oops. [27221]drry
2008-12-22 * 正規表現を修正しました。drry
2008-12-21* bugfix, getLatestVersionsuVene
2008-12-21add -update args.(plugin update from <updateURL>)suVene
2008-12-20* add version info to a completer header.(気にいらなければ外して...suVene
2008-12-16いくつかの要素をマルチバイト対応anekos
2008-12-14Fix indent.anekos
2008-12-14fix bugteramako
2008-12-14 * expand tagteramako
2008-12-13 * げんご。drry
2008-12-09detail がないと失敗するのを修正anekos
2008-12-09License を追加anekos
2008-12-08定義リストの終端に空行が無い場合に、途中で切れてし...anekos
2008-12-07 * fixed a regex.drry
2008-12-07情報の詳細とURLのリンクteramako
2008-12-07 * げんご。drry
2008-12-07UTF-8マルチバイトを文字化けしないように修正 and etcteramako
2008-12-07 * fixed a typo.drry
2008-12-07new releaseteramako
">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 } ); })();