Changeset 7882

Show
Ignore:
Timestamp:
03/31/07 18:49:35 (20 months ago)
Author:
alex
Message:

adding dojo.Uri and dojo.moduleUri. Also removing the "walk up" for .* packages. Refs #2500

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • dojo/trunk/_base/_loader/loader.js

    r7783 r7882  
    3333                _getModulePrefix: function(/*String*/module){ 
    3434                        // summary: gets the prefix associated with module 
     35                        var mp = this._modulePrefixes; 
    3536                        if(this._moduleHasPrefix(module)){ 
    36                                 return this._modulePrefixes[module].value; // String 
     37                                return mp[module].value; // String 
    3738                        } 
    3839                        return module; // String 
     
    235236                } 
    236237        } 
     238        // console.debug(syms); 
    237239        return syms; // Array 
    238240} 
     
    241243 
    242244dojo._loadModule = function(    /*String*/moduleName,  
    243                                                                         /*Boolean?*/exactOnly,  
    244                                                                         /*Boolean?*/omitModuleCheck){ 
     245                                                                /*Boolean?*/exactOnly,  
     246                                                                /*Boolean?*/omitModuleCheck){ 
    245247        //      summary: 
    246248        //              loads a Javascript module from the appropriate URI 
     
    279281 
    280282        // convert periods to slashes 
    281         var relpath = moduleName.replace(/\./g, '/') + '.js'; 
    282  
    283283        var nsyms = moduleName.split("."); 
    284          
    285284        var syms = this._getModuleSymbols(moduleName); 
    286         // console.debug(syms); 
    287285        var startedRelative = ((syms[0].charAt(0) != '/') && !syms[0].match(/^\w+:/)); 
    288286        var last = syms[syms.length - 1]; 
    289         var ok; 
     287        var relpath; 
    290288        // figure out if we're looking for a full package, if so, we want to do 
    291289        // things slightly diffrently 
    292290        if(last=="*"){ 
    293291                moduleName = nsyms.slice(0, -1).join('.'); 
    294                 while(syms.length){ 
    295                         syms.pop(); 
    296                         syms.push(this._pkgFileName); 
    297                         relpath = syms.join("/") + '.js'; 
    298                         if(startedRelative && relpath.charAt(0)=="/"){ 
    299                                 relpath = relpath.slice(1); 
    300                         } 
    301                         ok = this._loadPath(relpath, !omitModuleCheck ? moduleName : null); 
    302                         if(ok){ break; } 
    303                         syms.pop(); 
     292                syms.pop(); 
     293                relpath = syms.join("/") + "/" + this._pkgFileName + '.js'; 
     294                if(startedRelative && relpath.charAt(0)=="/"){ 
     295                        relpath = relpath.slice(1); 
    304296                } 
    305297        }else{ 
    306298                relpath = syms.join("/") + '.js'; 
    307299                moduleName = nsyms.join('.'); 
    308                 var modArg = !omitModuleCheck ? moduleName : null; 
    309                 ok = this._loadPath(relpath, modArg); 
    310  
    311                 if(!ok && !omitModuleCheck){ 
    312                         throw new Error("Could not load '" + moduleName + "'; last tried '" + relpath + "'"); 
    313                 } 
     300        } 
     301        var modArg = (!omitModuleCheck) ? moduleName : null; 
     302        var ok = this._loadPath(relpath, modArg); 
     303 
     304        if((!ok)&&(!omitModuleCheck)){ 
     305                throw new Error("Could not load '" + moduleName + "'; last tried '" + relpath + "'"); 
    314306        } 
    315307 
    316308        // check that the symbol was defined 
    317309        // Don't bother if we're doing xdomain (asynchronous) loading. 
    318         if(!omitModuleCheck && !this["isXDomain"]){ 
     310        if((!omitModuleCheck)&&(!this["isXDomain"])){ 
    319311                // pass in false so we can give better error 
    320312                module = this._loadedModules[moduleName]; 
     
    507499        dojo.i18n._requireLocalization.apply(dojo.hostenv, arguments); 
    508500} 
     501 
     502dojo.Url = function(/*dojo.Url||String...*/){ 
     503        // summary:  
     504        //              Constructor to create an object representing a URL. 
     505        // description:  
     506        //              Each argument is evaluated in order relative to the next until 
     507        //              a canonical uri is produced. To get an absolute Uri relative to 
     508        //              the current document use: 
     509        //              new dojo.Url(document.baseURI, url) 
     510 
     511        // TODO: support for IPv6, see RFC 2732 
     512 
     513        // resolve uri components relative to each other 
     514        var n = null; 
     515        var _a = arguments; 
     516        var uri = _a[0]; 
     517        for(var i = 1; i<_a.length; i++){ 
     518                if(!_a[i]){ continue; } 
     519 
     520                // Safari doesn't support this.constructor so we have to be explicit 
     521                var relobj = new dojo.Url(_a[i]+""); 
     522                var uriobj = new dojo.Url(uri+""); 
     523 
     524                if( 
     525                        (relobj.path=="")       && 
     526                        (!relobj.scheme)        && 
     527                        (!relobj.authority)     && 
     528                        (!relobj.query) 
     529                ){ 
     530                        if(relobj.fragment != null){ 
     531                                uriobj.fragment = relobj.fragment; 
     532                        } 
     533                        relobj = uriobj; 
     534                }else if(relobj.scheme == null){ 
     535                        relobj.scheme = uriobj.scheme; 
     536 
     537                        if(relobj.authority == null){ 
     538                                relobj.authority = uriobj.authority; 
     539 
     540                                if(relobj.path.charAt(0) != "/"){ 
     541                                        var path = uriobj.path.substring(0, 
     542                                                uriobj.path.lastIndexOf("/") + 1) + relobj.path; 
     543 
     544                                        var segs = path.split("/"); 
     545                                        for(var j = 0; j < segs.length; j++){ 
     546                                                if(segs[j] == "."){ 
     547                                                        if (j == segs.length - 1) { segs[j] = ""; } 
     548                                                        else { segs.splice(j, 1); j--; } 
     549                                                }else if(j > 0 && !(j == 1 && segs[0] == "") && 
     550                                                        segs[j] == ".." && segs[j-1] != ".."){ 
     551 
     552                                                        if(j == (segs.length - 1)){ 
     553                                                                segs.splice(j, 1); segs[j - 1] = ""; 
     554                                                        }else{ 
     555                                                                segs.splice(j - 1, 2); j -= 2; 
     556                                                        } 
     557                                                } 
     558                                        } 
     559                                        relobj.path = segs.join("/"); 
     560                                } 
     561                        } 
     562                } 
     563 
     564                uri = ""; 
     565                if(relobj.scheme != null){  
     566                        uri += relobj.scheme + ":"; 
     567                } 
     568                if(relobj.authority != null){ 
     569                        uri += "//" + relobj.authority; 
     570                } 
     571                uri += relobj.path; 
     572                if(relobj.query != null){ 
     573                        uri += "?" + relobj.query; 
     574                } 
     575                if(relobj.fragment != null){ 
     576                        uri += "#" + relobj.fragment; 
     577                } 
     578        } 
     579 
     580        this.uri = uri.toString(); 
     581 
     582        // break the uri into its main components 
     583        var regexp = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"; 
     584        var r = this.uri.match(new RegExp(regexp)); 
     585 
     586        this.scheme = r[2] || (r[1] ? "" : null); 
     587        this.authority = r[4] || (r[3] ? "" : null); 
     588        this.path = r[5]; // can never be undefined 
     589        this.query = r[7] || (r[6] ? "" : null); 
     590        this.fragment  = r[9] || (r[8] ? "" : null); 
     591 
     592        if(this.authority != null){ 
     593                // server based naming authority 
     594                regexp = "^((([^:]+:)?([^@]+))@)?([^:]*)(:([0-9]+))?$"; 
     595                r = this.authority.match(new RegExp(regexp)); 
     596 
     597                this.user = r[3] || null; 
     598                this.password = r[4] || null; 
     599                this.host = r[5]; 
     600                this.port = r[7] || null; 
     601        } 
     602 
     603        this.toString = function(){ return this.uri; } 
     604} 
     605 
     606dojo.moduleUrl = function(/*String*/module, /*dojo.Url||String*/url){ 
     607        // summary:  
     608        //              returns a Url object relative to a module 
     609        // description:  
     610        //              Examples:  
     611        //                      dojo.moduleUrl("dojo.widget","templates/template.html"); 
     612        //                      dojo.moduleUrl("acme","images/small.png") 
     613 
     614        var loc = dojo._getModuleSymbols(module).join('/'); 
     615        if(!loc){ return null; } 
     616        if(loc.lastIndexOf("/") != loc.length-1){ 
     617                loc += "/"; 
     618        } 
     619         
     620        //If the path is an absolute path (starts with a / or is on another 
     621        //domain/xdomain) then don't add the _baseUrl. 
     622        var colonIndex = loc.indexOf(":"); 
     623        if(loc.charAt(0) != "/" && (colonIndex == -1 || colonIndex > loc.indexOf("/"))){ 
     624                loc = dojo._baseUrl + loc; 
     625        } 
     626 
     627        return new dojo.Url(loc, url); 
     628} 
     629