UNPKG

dojo-util

Version:

Dojo utilities including build system for optimizing JavaScript application performance, and DOH testing tool

81 lines (70 loc) 2.69 kB
define(["../buildControl"], function(bc) { var evalPragma= function(code, kwArgs, fileName) { return !!eval("(" + code + ")"); }; return function(resource) { if(!bc.applyDojoPragmas){ return; } if(typeof resource.text!="string"){ return; } var foundIndex = -1, startIndex = 0, text= resource.text; while((foundIndex = text.indexOf("//>>", startIndex)) != -1){ //Found a conditional. Get the conditional line. var lineEndIndex = text.indexOf("\n", foundIndex); if(lineEndIndex == -1){ lineEndIndex = text.length - 1; } //Increment startIndex past the line so the next conditional search can be done. startIndex = lineEndIndex + 1; //Break apart the conditional. var conditionLine = text.substring(foundIndex, lineEndIndex + 1); var matches = conditionLine.match(/(exclude|include)Start\s*\(\s*["'](\w+)["']\s*,(.*)\)/); if(matches){ var type = matches[1]; var marker = matches[2]; var condition = matches[3]; var isTrue = false; //See if the condition is true. try{ isTrue = evalPragma(condition, bc, resource.src); }catch(e){ bc.log("dojoPragmaEvalFail", ["module", resource.mid, "expression", conditionLine, "error", e]); return; } //Find the endpoint marker. var endRegExp = new RegExp('\\/\\/\\>\\>\\s*' + type + 'End\\(\\s*[\'"]' + marker + '[\'"]\\s*\\)', "g"); var endMatches = endRegExp.exec(text.substring(startIndex, text.length)); if(endMatches){ var endMarkerIndex = startIndex + endRegExp.lastIndex - endMatches[0].length; //Find the next line return based on the match position. lineEndIndex = text.indexOf("\n", endMarkerIndex); if(lineEndIndex == -1){ lineEndIndex = text.length - 1; } //Should we include the segment? var shouldInclude = ((type == "exclude" && !isTrue) || (type == "include" && isTrue)); //Remove the conditional comments, and optionally remove the content inside //the conditional comments. var startLength = startIndex - foundIndex; text = text.substring(0, foundIndex) + (shouldInclude ? text.substring(startIndex, endMarkerIndex) : "") + text.substring(lineEndIndex + 1, text.length); //Move startIndex to foundIndex, since that is the new position in the file //where we need to look for more conditionals in the next while loop pass. startIndex = foundIndex; }else{ bc.log("dojoPragmaInvalid", ["module", resource.mid, "expression", conditionLine]); return; } }else if(/^\/\/>>\s*noBuildResolver\s*$/.test(conditionLine)){ resource.noBuildResolver = 1; } } resource.text= text; }; });