| /*jshint boss: true, rhino: true, unused: true, undef: true, quotmark: double */ |
| /*global JSHINT, readFully */ |
| |
| (function (args) { |
| "use strict"; |
| |
| var filenames = []; |
| var flags = {}; |
| var opts = {}; |
| var globals = {}; |
| var retval = 0; |
| var readf = (typeof readFully === "function" ? readFully : readFile); |
| |
| var optstr; // arg1=val1,arg2=val2,... |
| var predef; // global1=true,global2,global3,... |
| |
| args.forEach(function (arg) { |
| if (arg.indexOf("--") === 0) { |
| // Configuration Flags might be boolean or will be split into name and value |
| if (arg.indexOf("=") > -1) { |
| var o = arg.split("="); |
| flags[o[0].slice(2)] = o[1]; |
| } else { |
| flags[arg.slice(2)] = true; |
| } |
| |
| return; |
| } else if (arg.indexOf("=") > -1) { |
| // usual rhino configuration, like "boss=true,browser=true" |
| if (!optstr) { |
| // First time it's the options. |
| optstr = arg; |
| } else { |
| predef = arg; |
| } |
| |
| return; |
| } |
| |
| if (optstr) { |
| predef = arg; |
| return; |
| } |
| |
| filenames.push(arg); |
| }); |
| |
| if (filenames.length === 0) { |
| print("Usage: jshint.js file.js"); |
| quit(1); |
| } |
| |
| // If a config flag has been provided, try and load that |
| if ("config" in flags) { |
| var cfgFileContent; |
| try { |
| cfgFileContent = readf(flags.config); |
| } catch (e) { |
| print("Could not read config file " + flags.config); |
| quit(1); |
| } |
| |
| opts = JSON.parse(cfgFileContent); |
| } |
| |
| if (optstr) { |
| optstr.split(",").forEach(function (arg) { |
| var o = arg.split("="); |
| if (o[0] === "indent") { |
| opts[o[0]] = parseInt(o[1], 10); |
| } else { |
| opts[o[0]] = (function (ov) { |
| switch (ov) { |
| case "true": |
| return true; |
| case "false": |
| return false; |
| default: |
| return ov; |
| } |
| }(o[1])); |
| } |
| }); |
| } |
| |
| globals = opts.globals || {}; |
| delete(opts.globals); |
| |
| if (predef) { |
| predef.split(",").forEach(function (arg) { |
| var global = arg.split("="); |
| globals[global[0]] = global[1] === "true" ? true : false; |
| }); |
| } |
| |
| filenames.forEach(function (name) { |
| var input = readf(name); |
| |
| if (!input) { |
| print("jshint: Couldn't open file " + name); |
| quit(1); |
| } |
| |
| if (!JSHINT(input, opts, globals)) { |
| for (var i = 0, err; err = JSHINT.errors[i]; i += 1) { |
| print(err.reason + " (" + name + ":" + err.line + ":" + err.character + ")"); |
| print("> " + (err.evidence || "").replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1")); |
| print(""); |
| } |
| retval = 2; |
| } |
| }); |
| |
| quit(retval); |
| }(arguments)); |