source: Dev/trunk/src/client/dojo/_base/url.js @ 485

Last change on this file since 485 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 2.8 KB
Line 
1define(["./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});
Note: See TracBrowser for help on using the repository browser.