aboutsummaryrefslogtreecommitdiffstats
path: root/relative_move.js
diff options
context:
space:
mode:
authordamegane2008-07-17 14:44:31 +0000
committerdamegane2008-07-17 14:44:31 +0000
commitf069b8fcfcd1c27980f9686830930493cfc60d63 (patch)
tree364de379dbecf2746e5f9fd1dca5efb81ba28c26 /relative_move.js
parent961ba08013480becffbb4cbb5da9f14301f97bde (diff)
downloadvimperator-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.js98
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);
+ }
+ );
+})();