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にプルリク出しました。
relative_move.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
// Vimperator plugin: Relative Move
// Version: 0.3
//
// Usage:
//   If you stay "http://example.com/aaa/bbb/ccc"
//
//   :ropen ddd
//   :ropen ./ddd
//   :ropen ../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 コメント:

コメントを投稿