(function() { var root = this; // Options for the syntax checking var opts = function() { return { asi: false, bitwise: false, boss: false, curly: true, debug: false, devel: false, eqeqeq: false, evil: false, forin: false, immed: false, laxbreak: false, newcap: true, noarg: true, noempty: false, nonew: true, nomen: false, onevar: false, plusplus: false, regexp: false, undef: true, sub: true, strict: false, white: false }; }; // Options var optionsServer = opts(); var optionsBrowser = opts(); optionsBrowser.browser = true; // Predefined globals var makeGlobalsServer = function() { return {O:false, SCHEMA:false, HTTP:false, DBTime:false, console:false, JSON:false, '_':false, Handlebars:false, oForms:false, moment:false, XDate:false}; }; var globalsServer = makeGlobalsServer(); var globalsBrowser = {ONEIS:false, jQuery:false, '_':false}; var globalsTest = makeGlobalsServer(); globalsTest.T = false; // Add in the test global // Set globals root.syntax_tester_globals = function(string) { globals = eval("("+string+")"); }; // Syntax tester function root.syntax_tester = function(source, kind) { var globals; switch(kind) { case "js": globals = globalsServer; break; case "static": globals = globalsBrowser; break; case "test": globals = globalsTest; break; } if(!globals) { return "Wrong kind of file"; } var result = JSHINT(source, (kind !== 'static') ? optionsServer : optionsBrowser, globals ); if(result == true) { return null; } // success // Errors - compile a report, can't use the default one as it's HTML var data = JSHINT.data(); var errors = data.errors; var report = ''; for(var e = 0; e < errors.length; e++) { var err = errors[e]; if(err !== null && err !== undefined) { // oddly it will do that report += "line "+err.line+": "+err.reason+"\n "+err.evidence+"\n"; } } return (report == '') ? null : report; }; })();