url.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. define("dojo/_base/url", ["./kernel"], function(dojo) {
  2. // module:
  3. // dojo/url
  4. // summary:
  5. // This module contains dojo._Url
  6. var
  7. ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),
  8. ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),
  9. _Url = function(){
  10. var n = null,
  11. _a = arguments,
  12. uri = [_a[0]];
  13. // resolve uri components relative to each other
  14. for(var i = 1; i<_a.length; i++){
  15. if(!_a[i]){ continue; }
  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. if(
  22. relobj.path == "" &&
  23. !relobj.scheme &&
  24. !relobj.authority &&
  25. !relobj.query
  26. ){
  27. if(relobj.fragment != n){
  28. uriobj.fragment = relobj.fragment;
  29. }
  30. relobj = uriobj;
  31. }else if(!relobj.scheme){
  32. relobj.scheme = uriobj.scheme;
  33. if(!relobj.authority){
  34. relobj.authority = uriobj.authority;
  35. if(relobj.path.charAt(0) != "/"){
  36. var path = uriobj.path.substring(0,
  37. uriobj.path.lastIndexOf("/") + 1) + relobj.path;
  38. var segs = path.split("/");
  39. for(var j = 0; j < segs.length; j++){
  40. if(segs[j] == "."){
  41. // flatten "./" references
  42. if(j == segs.length - 1){
  43. segs[j] = "";
  44. }else{
  45. segs.splice(j, 1);
  46. j--;
  47. }
  48. }else if(j > 0 && !(j == 1 && segs[0] == "") &&
  49. segs[j] == ".." && segs[j-1] != ".."){
  50. // flatten "../" references
  51. if(j == (segs.length - 1)){
  52. segs.splice(j, 1);
  53. segs[j - 1] = "";
  54. }else{
  55. segs.splice(j - 1, 2);
  56. j -= 2;
  57. }
  58. }
  59. }
  60. relobj.path = segs.join("/");
  61. }
  62. }
  63. }
  64. uri = [];
  65. if(relobj.scheme){
  66. uri.push(relobj.scheme, ":");
  67. }
  68. if(relobj.authority){
  69. uri.push("//", relobj.authority);
  70. }
  71. uri.push(relobj.path);
  72. if(relobj.query){
  73. uri.push("?", relobj.query);
  74. }
  75. if(relobj.fragment){
  76. uri.push("#", relobj.fragment);
  77. }
  78. }
  79. this.uri = uri.join("");
  80. // break the uri into its main components
  81. var r = this.uri.match(ore);
  82. this.scheme = r[2] || (r[1] ? "" : n);
  83. this.authority = r[4] || (r[3] ? "" : n);
  84. this.path = r[5]; // can never be undefined
  85. this.query = r[7] || (r[6] ? "" : n);
  86. this.fragment = r[9] || (r[8] ? "" : n);
  87. if(this.authority != n){
  88. // server based naming authority
  89. r = this.authority.match(ire);
  90. this.user = r[3] || n;
  91. this.password = r[4] || n;
  92. this.host = r[6] || r[7]; // ipv6 || ipv4
  93. this.port = r[9] || n;
  94. }
  95. };
  96. _Url.prototype.toString = function(){ return this.uri; };
  97. return dojo._Url = _Url;
  98. });