aboutsummaryrefslogtreecommitdiffstats
path: root/relative_move.js
blob: a75eff3ccf9a08e54bb8b6140369ad2b6614003e (plain)
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.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);
        }
    );
})();
="o">= [ 'Name', 'Description']; if (!filter){ context.completions = completer; return; } filter = filter.toLowerCase(); context.completions = completer.filter( function(el) el[0].toLowerCase().indexOf(filter) == 0); } }); }, buildMenu: function(){ var self = this; var menu = document.getElementById('contentAreaContextMenu') .appendChild(document.createElement('menu')); menu.setAttribute('id', AppName + 'Context'); menu.setAttribute('label', AppName); menu.setAttribute('accesskey', 'L'); var menupopup = menu.appendChild(document.createElement('menupopup')); menupopup.setAttribute('id', AppName + 'ContextMenu'); for (let i=0, l=settings.length; i<l; i++){ let [name, app, args] = settings[i]; let menuitem = menupopup.appendChild(document.createElement('menuitem')); menuitem.setAttribute('id', AppName + i); menuitem.setAttribute('label', name + '\u3092\u8D77\u52D5'); menuitem.addEventListener('command', function() self.launch(name), false); } }, variables: { __noSuchMethod__: function(name) name, URL: function() gContextMenu && gContextMenu.onLink ? gContextMenu.getLinkURL() : buffer.URL, SEL: function(){ var selection = window.content.window.getSelection(); var sel = ''; for (let i=0, l=selection.rangeCount; i<l; i++) sel+=selection.getRangeAt(i).toString(); return sel; }, TITLE: function() buffer.title }, launch: function(appName){ var self = this; appName = appName.replace(/\\+/g, ''); // fix commandline input ' ' -> '\ ' settings.some( function([name, app, args]){ args = args instanceof Array ? args : args ? [args] : []; args = args.map( function( val ) val.replace(/%([A-Z]+)%/g, function( _, name ) self.variables[name]()) ); if (defaultCharset){ UConv.charset = defaultCharset; args = args.map( function( val ) UConv.ConvertFromUnicode(val) ); } if (appName == name){ io.run(app, args); return true; } return false; }); } } return new AppLauncher(); })();