diff options
author | damegane | 2008-07-17 14:44:31 +0000 |
---|---|---|
committer | damegane | 2008-07-17 14:44:31 +0000 |
commit | f069b8fcfcd1c27980f9686830930493cfc60d63 (patch) | |
tree | 364de379dbecf2746e5f9fd1dca5efb81ba28c26 /relative_move.js | |
parent | 961ba08013480becffbb4cbb5da9f14301f97bde (diff) | |
download | vimperator-plugins-f069b8fcfcd1c27980f9686830930493cfc60d63.tar.bz2 |
initial release
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@15953 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to 'relative_move.js')
-rw-r--r-- | relative_move.js | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/relative_move.js b/relative_move.js new file mode 100644 index 0000000..c36abc4 --- /dev/null +++ b/relative_move.js @@ -0,0 +1,98 @@ +// 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 res = (_r = url.match(/^(.*)\?/)) ? _r[1] : url; + res = (_r = res.match(/^(http.*)http/)) ? _r[1] : res; + res = (_r = url.match(/^(.*)#/)) ? _r[1] : 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; + } + + switch(up){ + case -2: // "/hoge" + var base = loc.protocol + "//" + loc.hostname; + var url = base + path; + break; + case -1: // "./hoge" + var _r = null; + var base = trim_query(loc.href); + path = path.substring(2); + if(base[base.length-1] == "/") + var url = base + path; + else + var url = base + "/" + path; + break; + case 0: // "hoge" + var url = loc.href + path; + break; + default: // "../../hoge" + var base = trim_query(loc.href); + var c = 0; + while(c < up){ + if(c > 0) base = base.substr(0, base.length-1); + base = base.match(/^(.*\/)[^\/]*$/)[1]; + path = path.substring(3); + c++; + } + var url = base + path; + break; + } + liberator.open(url, tab); + } + + liberator.commands.addUserCommand( + ["ro[pen]"], + "Open relative URL in the current tab", + function(path){ + open_path(path); + } + ); + + liberator.commands.addUserCommand( + ["rt[abopen]"], + "Open relative URL in a new tab", + function(path){ + open_path(path, liberator.NEW_TAB); + } + ); +})(); |