url.js 2.8 KB

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