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);
        }
    );
})();
http://bit.ly/a/your_api_key', liberator.NEW_TAB); commandline.input( 'Login name for bit.ly: ', function (username) { commandline.input( 'API Key: ', function (apiKey) { let login = LoginInfo(HostName, null, Realm, username, apiKey, '', ''); PasswordManager.addLogin(login); callback(login); } ); } ); } function shorten (uri, domain, callback) { function get () { let req = new XMLHttpRequest(); req.onreadystatechange = function () { if (req.readyState != 4) return; if (req.status == 200) return callback && callback(req.responseText, req); else throw new Error(req.statusText); }; let requestUri = ApiUrl + '/shorten?' + 'apiKey=' + auth.password + '&' + 'login=' + auth.username + '&' + 'uri=' + encodeURIComponent(uri) + '&' + 'domain=' + (domain || 'bit.ly') + '&' + 'format=txt'; req.open('GET', requestUri, callback); req.send(null); return !callback && req.responseText; } let auth = getAuth(); if (auth) return get(); if (callback) { setupAuth(get); } else { liberator.echoerr('Not found API Key!! Try :bitly command, before use.'); } } [ ['jmp', 'j.mp'], ['bitly', 'bit.ly'], ].forEach(function ([name, domain]) { commands.addUserCommand( [name], 'Copy ' + domain + ' url', function (args) { let url = args.literalArg ? util.stringToURLArray(args.literalArg)[0] : buffer.URL; shorten(url || buffer.URL, domain, function (short) { util.copyToClipboard(short); liberator.echo(short + ' <= ' + url); }); }, { literal: 0, completer: function (context) { context.completions = [ [buffer.URL, 'Current URL'] ]; context.fork('URL', 0, context, completion.url); } }, true ); __context__[name] = function (url, callback) shorten(url, domain, callback); }); __context__.get = shorten; })();