// Vimperator plugin: "Update mixi echo" // Last Change: 21-Oct-2008. Jan 2008 // License: Creative Commons // Maintainer: mattn - 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]*?]*)?>|[\\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 = []; 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(/.toSource() .replace(/(?:\r?\n|\r)[ \t]*/g, " ") + statuses.map(function(status) <> {status.user.name}‬ .toSource() .replace(/(?:\r?\n|\r)[ \t]*/g, " ") + sprintf(': ', status.text)) .join("
"); //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 } ); })(); 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
// Vimperator plugin: Relative Move
// Version: 0.1
//
// Usage:
//   If you stay "http://example.com/aaa/bbb/ccc"
//
//   :ropen ddd
//     move to http://example.com/aaa/bbb/cccddd
//   :ropen ./ddd
//     move to http://example.com/aaa/bbb/ccc/ddd
//   :ropen ../ddd
//     move to http://example.com/aaa/bbb/ddd
//   :ropen ../../ddd
//     move to http://example.com/aaa/ddd
//   :ropen /fuga
//     move to http://example.com/ddd


(function (){
    function trim_query(url){
        var _r;
        var res = (_r = url.match(/^.*(?=\?)/)) ? _r[0] : url;
        res = (_r = res.match(/^https?:\/\/.*(?=https?:\/\/)/)) ? _r[0] : res;
        res = (_r = url.match(/^.*(?=#)/)) ? _r[0] : res;
        return res;
    }

    function open_path(path, tab){
        var win = window.content.window;
        var loc = win.location;
        var splited_path = path.split(/\/+/);
        var up = 0;

        if(!tab){
            tab = liberator.CURRENT_TAB;
        }

        switch(splited_path[0]){
            case ".":
                up = -1;
                break;
            case "..":
                while(splited_path[up] == "..") up++;
                break;
            case "":
                up = -2;
                break;
            default:
                break;
        }

        var url, base;
        switch(up){
            case -2: // "/hoge"
                base = loc.protocol + "//" + loc.hostname;
                url = base + path;
                break;
            case -1: // "./hoge"
                base = trim_query(loc.href);
                path = path.substring(2);
                if(base[base.length-1] == "/")
                    url = base + path;
                else
                    url = base + "/" + path;
                break;
            case 0: // "hoge"
                url = loc.href + path;
                break;
            default: // "../../hoge"
                base = trim_query(loc.href);
                let c = 0;
                while(c < up){
                    if(c > 0) base = base.substr(0, base.length-1);
                    [base] = base.match(/^.*\/(?=[^\/]*$)/);
                    path = path.substring(3);
                    c++;
                }
                url = base + path;
            break;
        }
        liberator.open(url, tab);
    }

    commands.addUserCommand(
        ["ro[pen]"],
        "Open relative URL in the current tab",
        open_path
    );

    commands.addUserCommand(
        ["rt[abopen]"],
        "Open relative URL in a new tab",
        function(path){
            open_path(path, liberator.NEW_TAB);
        }
    );
})();