2016年1月28日木曜日

Vimperatorプラグイン"relative_move.js"をFirefox 44で動くようにした

Firefox 44で…というか、最近のFirefoxで動くようにした感じ。
relative_move.jsは、相対パス指定でページを移動できるプラグインで、俺的にはすごく便利なんだけど、メンテされてない様子を見ると、みんな使ってないのかな。
GitHubへのPushはしていない。後で時間があったらPushしようかなと。
それよりも、Firefox 43では動いていたcaret-hint.jsが44で動かないのを何とかしないと…。
2016.02.05追記:caret-hint.js は Vimperator 3.11.3 で動くようになってた。助かった。
2016.02.08追記 GitHubにプルリク出しました。
2016.03.22追記 修正しきれてない箇所があったので、修正してGitHubにプルリク出しました。
// Vimperator plugin: Relative Move
// Version: 0.3
//
// 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.toString().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.toString().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.toString().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);
        }
    );
})();

0 コメント:

コメントを投稿