]>
Commit | Line | Data |
---|---|---|
f0cfe83e AD |
1 | define("dojo/_base/url", ["./kernel"], function(dojo){ |
2 | // module: | |
3 | // dojo/url | |
4 | ||
5 | var | |
6 | ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"), | |
7 | ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"), | |
8 | _Url = function(){ | |
9 | var n = null, | |
10 | _a = arguments, | |
11 | uri = [_a[0]]; | |
12 | // resolve uri components relative to each other | |
13 | for(var i = 1; i<_a.length; i++){ | |
14 | if(!_a[i]){ continue; } | |
15 | ||
16 | // Safari doesn't support this.constructor so we have to be explicit | |
17 | // FIXME: Tracked (and fixed) in Webkit bug 3537. | |
18 | // http://bugs.webkit.org/show_bug.cgi?id=3537 | |
19 | var relobj = new _Url(_a[i]+""), | |
20 | uriobj = new _Url(uri[0]+""); | |
21 | ||
22 | if( | |
23 | relobj.path == "" && | |
24 | !relobj.scheme && | |
25 | !relobj.authority && | |
26 | !relobj.query | |
27 | ){ | |
28 | if(relobj.fragment != n){ | |
29 | uriobj.fragment = relobj.fragment; | |
30 | } | |
31 | relobj = uriobj; | |
32 | }else if(!relobj.scheme){ | |
33 | relobj.scheme = uriobj.scheme; | |
34 | ||
35 | if(!relobj.authority){ | |
36 | relobj.authority = uriobj.authority; | |
37 | ||
38 | if(relobj.path.charAt(0) != "/"){ | |
39 | var path = uriobj.path.substring(0, | |
40 | uriobj.path.lastIndexOf("/") + 1) + relobj.path; | |
41 | ||
42 | var segs = path.split("/"); | |
43 | for(var j = 0; j < segs.length; j++){ | |
44 | if(segs[j] == "."){ | |
45 | // flatten "./" references | |
46 | if(j == segs.length - 1){ | |
47 | segs[j] = ""; | |
48 | }else{ | |
49 | segs.splice(j, 1); | |
50 | j--; | |
51 | } | |
52 | }else if(j > 0 && !(j == 1 && segs[0] == "") && | |
53 | segs[j] == ".." && segs[j-1] != ".."){ | |
54 | // flatten "../" references | |
55 | if(j == (segs.length - 1)){ | |
56 | segs.splice(j, 1); | |
57 | segs[j - 1] = ""; | |
58 | }else{ | |
59 | segs.splice(j - 1, 2); | |
60 | j -= 2; | |
61 | } | |
62 | } | |
63 | } | |
64 | relobj.path = segs.join("/"); | |
65 | } | |
66 | } | |
67 | } | |
68 | ||
69 | uri = []; | |
70 | if(relobj.scheme){ | |
71 | uri.push(relobj.scheme, ":"); | |
72 | } | |
73 | if(relobj.authority){ | |
74 | uri.push("//", relobj.authority); | |
75 | } | |
76 | uri.push(relobj.path); | |
77 | if(relobj.query){ | |
78 | uri.push("?", relobj.query); | |
79 | } | |
80 | if(relobj.fragment){ | |
81 | uri.push("#", relobj.fragment); | |
82 | } | |
83 | } | |
84 | ||
85 | this.uri = uri.join(""); | |
86 | ||
87 | // break the uri into its main components | |
88 | var r = this.uri.match(ore); | |
89 | ||
90 | this.scheme = r[2] || (r[1] ? "" : n); | |
91 | this.authority = r[4] || (r[3] ? "" : n); | |
92 | this.path = r[5]; // can never be undefined | |
93 | this.query = r[7] || (r[6] ? "" : n); | |
94 | this.fragment = r[9] || (r[8] ? "" : n); | |
95 | ||
96 | if(this.authority != n){ | |
97 | // server based naming authority | |
98 | r = this.authority.match(ire); | |
99 | ||
100 | this.user = r[3] || n; | |
101 | this.password = r[4] || n; | |
102 | this.host = r[6] || r[7]; // ipv6 || ipv4 | |
103 | this.port = r[9] || n; | |
104 | } | |
105 | }; | |
106 | _Url.prototype.toString = function(){ return this.uri; }; | |
107 | ||
108 | return dojo._Url = _Url; | |
109 | }); |