//The functions in this file assume that buildUtil.js have been loaded. var buildUtilXd = {}; buildUtilXd.setXdDojoConfig = function(/*String*/fileContents, /*String*/url){ //summary: sets sets up xdomain loading for a particular URL. //parameters: // fileContents: be a built dojo.js (can be uncompressed or compressed). // url: value should be the url to the directory that contains the dojo, // dijit and dojox directories. // Example: "http://some.domain.com/dojo090" (no ending slash) //This function will inject some contents after the dojo.registerModulePath() definition. //The contents of fileName should have been a dojo.js that includes the contents //of loader_xd.js (specify loader=xdomain in the build command). //This code is not very robust. It will break if dojo.registerModulePath definition //changes to anything more advanced. var match = fileContents.match(/(dojo\.registerModulePath\s*=\s*function.*\{)/); //Find the next two } braces and in inject code after that. var endIndex = fileContents.indexOf("}", match.index); endIndex = fileContents.indexOf("}", endIndex + 1); if(fileContents.charAt(endIndex + 1) == ";"){ endIndex += 1; } endIndex +=1; var lineSeparator = fileUtil.getLineSeparator(); return fileContents.substring(0, endIndex) + lineSeparator + "if(typeof dojo.config[\"useXDomain\"] == \"undefined\"){" + "dojo.config.useXDomain = true;};\ndojo.registerModulePath(\"dojo\", \"" + url + "/dojo" + "\");\ndojo.registerModulePath(\"dijit\", \"" + url + "/dijit" + "\");\ndojo.registerModulePath(\"dojox\", \"" + url + "/dojox" + "\");" + lineSeparator + fileContents.substring(endIndex, fileContents.length); } buildUtilXd.xdgen = function( /*String*/prefixName, /*String*/prefixPath, /*Array*/prefixes, /*RegExp*/optimizeIgnoreRegExp, /*Object*/kwArgs ){ //summary: generates the .xd.js files for a build. var jsFileNames = fileUtil.getFilteredFileList(prefixPath, /\.js$/, true); //Construct a regexp to avoid xd generating loader_xd.js, since shrinksafe //does not like the resulting javascript that is generated, because of //bug http://trac.dojotoolkit.org/ticket/2766 var loaderIgnoreRegExp = /dojo\/_base\/_loader\/loader_xd/; for(var i = 0; i < jsFileNames.length; i++){ var jsFileName = jsFileNames[i]; //Some files, like the layer files, have already been xd //processed, so be sure to skip those. if(!jsFileName.match(optimizeIgnoreRegExp) && !jsFileName.match(loaderIgnoreRegExp)){ var xdFileName = jsFileName.replace(/\.js$/, ".xd.js"); var fileContents = fileUtil.readFile(jsFileName); //Files in nls directories, except for the ones that have multiple //bundles flattened (therefore have a dojo.provide call), //need to have special xd contents. if(jsFileName.match(/\/nls\//) && fileContents.indexOf("dojo.provide(") == -1){ var xdContents = buildUtilXd.makeXdBundleContents(prefixName, prefixPath, jsFileName, fileContents, prefixes, kwArgs); }else{ xdContents = buildUtilXd.makeXdContents(fileContents, prefixes, kwArgs); } fileUtil.saveUtf8File(xdFileName, xdContents); } } } //Function that generates the XD version of the module file's contents buildUtilXd.makeXdContents = function(fileContents, prefixes, kwArgs){ var dependencies = []; //Use the regexps to find resource dependencies for this module file. var depMatches = buildUtil.removeComments(fileContents).match(buildUtil.globalDependencyRegExp); if(depMatches){ for(var i = 0; i < depMatches.length; i++){ var partMatches = depMatches[i].match(buildUtil.dependencyPartsRegExp); var depCall = partMatches[1]; var depArgs = partMatches[2]; if(depCall == "requireLocalization"){ //Need to find out what locales are available so the dojo loader //only has to do one script request for the closest matching locale. var reqArgs = i18nUtil.getRequireLocalizationArgsFromString(depArgs); if(reqArgs.moduleName){ //Find the list of locales supported by looking at the path names. var locales = i18nUtil.getLocalesForBundle(reqArgs.moduleName, reqArgs.bundleName, prefixes); //Add the supported locales to the requireLocalization arguments. if(!reqArgs.localeName){ depArgs += ", null"; } depCall = "requireLocalization"; depArgs += ', "' + locales.join(",") + '"'; }else{ //Malformed requireLocalization call. Skip it. May be a comment. continue; } } dependencies.push('"' + depCall + '", ' + depArgs); } } //Build the xd file contents. var xdContentsBuffer = []; var scopeArgs = kwArgs.xdScopeArgs || "dojo, dijit, dojox"; //Start the module function wrapper. xdContentsBuffer.push((kwArgs.xdDojoScopeName || "dojo") + "._xdResourceLoaded(function(" + scopeArgs + "){\n"); //See if there are any dojo.loadInit calls var loadInitCalls = buildUtilXd.extractLoadInits(fileContents); if(loadInitCalls){ //Adjust fileContents since extractLoadInits removed something. fileContents = loadInitCalls[0]; //Add any loadInit calls to an array passed _xdResourceLoaded for(i = 1; i < loadInitCalls.length; i++){ xdContentsBuffer.push(loadInitCalls[i] + ";\n"); } } xdContentsBuffer.push("return {"); //Add in dependencies section. if(dependencies.length > 0){ xdContentsBuffer.push("depends: ["); for(i = 0; i < dependencies.length; i++){ if(i > 0){ xdContentsBuffer.push(",\n"); } xdContentsBuffer.push("[" + dependencies[i] + "]"); } xdContentsBuffer.push("],"); } //Add the contents of the file inside a function. //Pass in module names to allow for multiple versions of modules in a page. xdContentsBuffer.push("\ndefineResource: function(" + scopeArgs + "){"); //Remove requireLocalization calls, since that will mess things up. //String() part is needed since fileContents is a Java object. xdContentsBuffer.push(String(fileContents).replace(/dojo\.(requireLocalization|i18n\._preloadLocalizations)\([^\)]*\)/g, "")); xdContentsBuffer.push("\n}};});"); return xdContentsBuffer.join(""); } buildUtilXd.makeXdBundleContents = function(prefix, prefixPath, srcFileName, fileContents, prefixes, kwArgs){ //logger.info("Flattening bundle: " + srcFileName); var bundleParts = i18nUtil.getBundlePartsFromFileName(prefix, prefixPath, srcFileName); if(!bundleParts){ return null; } var moduleName = bundleParts.moduleName; var bundleName = bundleParts.bundleName; var localeName = bundleParts.localeName; //logger.trace("## moduleName: " + moduleName + ", bundleName: " + bundleName + ", localeName: " + localeName); //If this is a dojo bundle, it will have already been flattened via the normal build process. //If it is an external bundle, then we didn't flatten it during the normal build process since //right now, we don't make copies of the external module source files. Need to figure that out at some //point, but for now, need to get flattened contents for external modules. fileContents = (prefix.indexOf("dojo") == 0) ? fileContents : i18nUtil.makeFlatBundleContents(prefix, prefixPath, srcFileName); //Final XD file contents. fileContents = 'dojo.provide("' + moduleName + '.nls.' + (localeName ? localeName + '.' : '') + bundleName + '");' + 'dojo._xdLoadFlattenedBundle("' + moduleName + '", "' + bundleName + '", "' + localeName + '", ' + fileContents + ');'; //Now make a proper xd.js file out of the content. return buildUtilXd.makeXdContents(fileContents, prefixes, kwArgs); } buildUtilXd.loadInitRegExp = /dojo\.loadInit\s*\(/g; buildUtilXd.extractLoadInits = function(/*String*/fileContents){ return buildUtil.extractMatchedParens(buildUtilXd.loadInitRegExp, fileContents); }